折腾了一天,终于把这个图片接口(https://api.mch.weixin.qq.com/v3/merchant/media/upload)调通了。看到社区里面有不少小伙伴遇到了一样的问题,这里简单分享一下我的经验。
开发图片上传接口要先了解微信支付v3的接口规范,还好我之前有开发过v3的接口,所以这块问题不大,不清楚的小伙伴可以先看V3接口规范:https://wechatpay-api.gitbook.io/wechatpay-api-v3/
PS:我第一次开发v3的接口时,也遇到不少问题,也简单说一下注意事项:
1、v3接口使用rsa签名方式,如果现有的商户号不是使用的权威ca证书,要先升级证书,这部分可以参考:https://wechatpay-api.gitbook.io/wechatpay-api-v3/ren-zheng/zheng-shu
2、签名的传递和计算方式和之前的接口不太一样,具体可以参考:https://wechatpay-api.gitbook.io/wechatpay-api-v3/ren-zheng/qian-ming-he-zheng-shu
言归正传,来说说图片上传接口的问题。我之前没有开发过上传文件的接口,所以对接口文档里面提到的boundary内容完全一脸懵。于是网上搜了一下,发现这篇文章说的算比较清楚了:https://blog.csdn.net/Ivanljt/article/details/52663726,于是就照葫芦画瓢去试试。
除了上面说到的post提交文件的问题,当时我还遇到一个签名的问题。之前开发v3接口,是要把post的json数据参与签名,然后实际post的也是json的数据。但是这次图片上传接口有点不一样,计算签名的时候需要把这个json数据{"filename":"apitest.jpeg","sha256":"67ed2c80b789a3d0e524c62c1fcff058da02b448dcb8644ecdab9b70ee04bf4b"}参与签名,但是post的是boundary那块内容。这个也是我测试多次后才解决的。
所以计算签名的原串是下面这样的:
POST
/v3/merchant/media/upload
1567054192 //时间戳
8e2c381d4dd04f1c55093f22c59c3a08 //随机数
{"filename":"apitest.jpeg","sha256":"67ed2c80b789a3d0e524c62c1fcff058da02b448dcb8644ecdab9b70ee04bf4b"}
接下来看看怎么处理boundary那块内容,参考了上述链接那哥们的代码,post的内容格式如下:
--123456qwert111222
Content-Disposition: form-data;name="meta";
Content-Type: application/json;
//这里必须要空一行
{"filename":"apitest.jpeg","sha256":"67ed2c80b789a3d0e524c62c1fcff058da02b448dcb8644ecdab9b70ee04bf4b"}
--123456qwert111222
Content-Disposition: form-data;name="file"; filename="apitest.jpeg";
Content-Type: image/jpeg
//这里必须要空一行
//这里是文件的二进制数据
--123456qwert111222--
备注:
123456qwert111222是我自定义的boundary内容,大家可以改成自己定义的字符串;
内容必须以--boundary开头,中间的内容以--boundary分割,结尾以--boundary--结束;
每一行结尾要加上换行符\r\n
最后放上我的测试代码,水平有限,如有错漏之处,请多多指教。
https://developers.weixin.qq.com/community/pay/doc/000ee4d8e10e18bc3d1999e0d54404
后来试着改成用httpclient和httpmime实现的方式:
https://developers.weixin.qq.com/community/pay/doc/000ae8e8904a38ac4019bb24651404
大佬,牛!