微信图片上传接口地址:https://api.mch.weixin.qq.com/v3/merchant/media/upload

1、上传方法

 1 using HttpHandlerDemo;
2 using Newtonsoft.Json;
3 using System;
4 using System.Collections.Generic;
5 using System.IO;
6 using System.Linq;
7 using System.Net;
8 using System.Net.Http;
9 using System.Net.Http.Headers;
10 using System.Security.Cryptography;
11 using System.Text;
12 using HttpHandler = Lib.HttpHandler;
13
14 namespace API
15 {
16 public class Helper
17 {
18 public static string UploadImg(string b64)
19 {
20 byte[] data = Convert.FromBase64String(b64);
21 //证书本地路径
22 string certPath = @"***";
23 //证书秘钥
24 string certPwd = "***";
25 //商户号
26 string mchid = "***";
27 //证书编号
28 string serialNo = "***";
29 string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));
30 var sha256 = Sha256(data);
31 var meta = new
32 {
33 sha256 = sha256,
34 filename = Guid.NewGuid().ToString().Replace("-", "") + ".png"
35 };
36 var json = JsonConvert.SerializeObject(meta);
37 var httpHandler = new HttpHandler(mchid, serialNo, certPath, certPwd, json);
38 HttpClient client = new HttpClient(httpHandler);
39 using (var content = new MultipartFormDataContent(boundary))
40 {
41 content.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); //这里必须添加
42 content.Add(new StringContent(json, Encoding.UTF8, "application/json"), "\"meta\""); //这里主要必须要双引号
43
44 var byteArrayContent = new ByteArrayContent(data);
45 byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpg");
46 content.Add(byteArrayContent, "\"file\"", "\"" + meta.filename + "\""); //这里主要必须要双引号
47 try
48 {
49 using (var response = client.PostAsync("https://api.mch.weixin.qq.com/v3/merchant/media/upload", content)) //上传
50 using (var responseContent = response.Result.Content)
51 {
52 string responseBody = responseContent.ReadAsStringAsync().Result;
53 var dic = Newtonsoft.Json.Linq.JObject.Parse(responseBody);
54 return dic["media_id"].ToString();
55 }
56 }
57 catch (Exception e)
58 {
59 return null;
60 }
61
62
63 }
64 }
65
66 public static string Sha256(byte[] bytes)
67 {
68 byte[] hash = SHA256Managed.Create().ComputeHash(bytes);
69 StringBuilder builder = new StringBuilder();
70 for (int i = 0; i < hash.Length; i++)
71 {
72 builder.Append(hash[i].ToString("X2"));
73 }
74 return builder.ToString();
75 }
76
77 }
78 }

2、Lib.HttpHandler代码

  1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Net.Http;
5 using System.Net.Http.Headers;
6 using System.Security.Authentication;
7 using System.Security.Cryptography;
8 using System.Security.Cryptography.X509Certificates;
9 using System.Text;
10 using System.Threading;
11 using System.Threading.Tasks;
12
13 namespace Lib
14 {
15 /// <summary>
16 /// 头文件
17 /// </summary>
18 public class HttpHandler : DelegatingHandler
19 {
20 private readonly string merchantId;
21 private readonly string serialNo;
22 private readonly string certPath;
23 private readonly string certPwd;
24 private readonly string json;
25 /// <summary>
26 /// 构造方法
27 /// </summary>
28 /// <param name="merchantId">商户号</param>
29 /// <param name="merchantSerialNo">证书序列号</param>
30 /// <param name="certPath">证书路径</param>
31 /// <param name="certPwd">证书秘钥</param>
32 /// <param name="json">签名json数据,默认不需要传入,获取body内容,如传入签名传入参数上传图片时需传入</param>
33 public HttpHandler(string merchantId, string merchantSerialNo, string certPath, string certPwd, string json = "")
34 {
35
36 HttpClientHandler handler = new HttpClientHandler();
37 handler.ClientCertificateOptions = ClientCertificateOption.Manual;
38 handler.SslProtocols = SslProtocols.Tls12;
39 try
40 {
41 handler.ClientCertificates.Add(new X509Certificate2(certPath, certPwd,
42 X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet));
43 }
44 catch (Exception e)
45 {
46 throw new Exception("ca err(证书错误)");
47 }
48 handler.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls;
49 handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
50 InnerHandler = handler;
51 this.merchantId = merchantId;
52 this.serialNo = merchantSerialNo;
53 this.certPath = certPath;
54 this.certPwd = certPwd;
55 this.json = json;
56 }
57
58 protected async override Task<HttpResponseMessage> SendAsync(
59 HttpRequestMessage request,
60 CancellationToken cancellationToken)
61 {
62 var auth = await BuildAuthAsync(request);
63 string value = $"WECHATPAY2-SHA256-RSA2048 {auth}";
64 request.Headers.Add("Authorization", value);
65 request.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36");
66 MediaTypeWithQualityHeaderValue mediaTypeWithQualityHeader = new MediaTypeWithQualityHeaderValue("application/json");
67 request.Headers.Accept.Add(mediaTypeWithQualityHeader);
68 request.Headers.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
69 return await base.SendAsync(request, cancellationToken);
70 }
71
72 protected async Task<string> BuildAuthAsync(HttpRequestMessage request)
73 {
74 string method = request.Method.ToString();
75 string body = "";
76 if (method == "POST" || method == "PUT" || method == "PATCH")
77 {
78 if (!string.IsNullOrEmpty(json))
79 body = json;
80 else
81 {
82 var content = request.Content;
83 body = await content.ReadAsStringAsync();
84 }
85 }
86 string uri = request.RequestUri.PathAndQuery;
87 var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
88 string nonce = Guid.NewGuid().ToString("n");
89 string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n";
90
91 string signature = Sign(message);
92 return $"mchid=\"{merchantId}\",nonce_str=\"{nonce}\",timestamp=\"{timestamp}\",serial_no=\"{serialNo}\",signature=\"{signature}\"";
93 }
94
95 //SHA256withRSA
96 public string Sign(string str)
97 {
98 byte[] bt = Encoding.GetEncoding("utf-8").GetBytes(str);
99 var sha256 = new SHA256CryptoServiceProvider();
100 byte[] rgbHash = sha256.ComputeHash(bt);
101
102 try
103 {
104 var rsa = GetPrivateKey();
105 var key = new RSACryptoServiceProvider();
106 var paras = rsa.ExportParameters(true);
107 key.ImportParameters(paras);
108 RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
109 formatter.SetHashAlgorithm("SHA256");
110 byte[] inArray = formatter.CreateSignature(rgbHash);
111 return Convert.ToBase64String(inArray);
112 }
113 catch (Exception e)
114 {
115 return e.Message;
116 }
117 }
118
119 private RSACryptoServiceProvider GetPrivateKey()
120 {
121 var pc = new X509Certificate2(certPath, certPwd, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
122 return (RSACryptoServiceProvider)pc.PrivateKey;
123 }
124
125 }
126 }

仅此记录一下

微信支付特约商户进件中base64格式图片上传的更多相关文章

  1. Aps.net中基于bootstrapt图片上传插件的应用

    Aps.net中基于bootstrapt图片上传插件的应用 在最近的项目中需要使用一个图片上传的功能,而且是多张图片同时上传到服务器的文件夹中,将图片路径存放在数据库中.为了外观好看使用了bootst ...

  2. 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.(抄的...) UEditor是非常好用的富文 ...

  3. ssm项目中KindEditor的图片上传插件,浏览器兼容性问题

    解决办法: 原因:使用@ResponseBody注解返回java对象,在浏览器中是Content-Type:application/json;charset=UTF-8 我们需要返回字符串(Strin ...

  4. hybird app项目实例:安卓webview中HTML5拍照图片上传

    应用的平台环境:安卓webview: 涉及的技术点: (1) <input type="file" > :在开发中,安卓webview默认点击无法调用文件选择与相机拍照 ...

  5. PHP base64多图片上传

    // 多图片上传,base64 public function upload_multi() { $pic = $_POST['pic']; if (!$pic) { $this->json-& ...

  6. Django中怎么做图片上传--图片展示

    1.首先是html页面的form表单的三大属性,action是提交到哪,method是提交方式,enctype只要有图片上传就要加这个属性 Django框架自带csrf_token ,所以需要在前端页 ...

  7. MVC 中使用kindEditor 图片上传在IE 上进行上传出现的问题

    在IE 上使用KindEditor 进行单张图片上传的时候会出现一个下载安全警告,这样将会造成图片上传失败,出现的错误页面:

  8. 在SSM框架中如何将图片上传到数据库中

    今天我们来看看SSM中如何将图片转换成二进制,最后传入到自己的数据库中,好了,废话不多说,我们开始今天的学习,我这里用的编辑器是IDEA 1.导入图片上传需要的jar依赖包 1 <depende ...

  9. html5 图片转为base64格式异步上传

    因为有这个需求(移动端),所以就研究了一下,发现还挺不错的.这个主要是用了html5的API,不需要其他的JS插件,不过只有支持html5的浏览器才行,就现在而言应该大部份都支持的.<!DOCT ...

随机推荐

  1. MySQL 之 innodb 日志管理 -- 1. 基本日志文件

    1.基本日志文件分类 错误日志(error log) 慢查询日志日志(slow query log) 二进制日志(binlog) 查询日志(general log) 2.错误日志 主要包括mysql的 ...

  2. CAD& CG 2020 胡事民教授—开源框架Jittor的创新与探索

    题目:深度学习框架"计图"的创新与探索 报告人:胡事民 报告人简介:胡事民,清华大学计算机系教授,主要研究方向为计算机图形学.虚拟现实.智能信息处理和系统软件等. 报告简介:深度学 ...

  3. mPDF的简单使用

    1. 基本使用 安装 1  在项目下composer文件中 添加 "mpdf/mpdf":"~7.1.9" 测试环境为Yii项目 其他框架composer安装大 ...

  4. Prometheus 系列开篇:为什么要学 Prometheus ?

    「Prometheus 系列开篇:为什么要学 Prometheus ?」首发于[陈树义]公众号,点击跳转到原文https://mp.weixin.qq.com/s/HCS6X3l6nVBw_hAnd6 ...

  5. 数据结构与算法:AVL树

    AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.AV ...

  6. File、Blob、ArrayBuffer等文件类的对象有什么区别和联系

    前言 在前端中处理文件时会经常遇到File.Blob.ArrayBuffer以及相关的处理方法或方式如FileReader.FormData等等这些名词,对于这些常见而又不常见的名词,我相信大多数人对 ...

  7. [转] Swoft HTTP 服务

    转载自Go语言中文网, https://studygolang.com/articles/20667 传统架构 PHP-FPM + Nginx 传统架构中所使用的Nginx + PHP-FPM的模型中 ...

  8. mysql间隙锁 转

    前面一文 mysql锁 介绍了mysql innodb存储引擎的各种锁,本文介绍一下innodb存储引擎的间隙锁,就以下问题展开讨论 1.什么是间隙锁?间隙锁是怎样产生的? 2.间隙锁有什么作用? 3 ...

  9. linux(centos8):jmeter5.3并发测试实例(参数在范围内随机取值)

    一,测试的url地址说明: 1,这是一个秒杀功能的url: http://127.0.0.1:8080/second/skusecond?actid=2020&skuid=cpugreen&a ...

  10. Windows和Mac两种操作系统下CSS不兼容问题的解决

    这两天碰到一个问题,就是一个小图标的大小和定位的位置在不同的操作系统下是不一样的. 查了下资料,自己解决出来了,整理如下: html: <i :class="['cursor-poin ...