1. 接口规则 为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,我们推出了全新的微信支付APIv3接口。该版本API的具体规则请参考 APIv3接口规则 。
2. 开发准备 2.1. 搭建和配置开发环境 开发者应当依据自身的编程语言来构建并配置相应的开发环境。
3. 快速接入
3.1. 业务流程图 步骤3: 用户发起投诉后,微信支付通过 投诉通知回调 通知商户投诉单需处理。
步骤6: 商户接收投诉后,可通过 回复用户API 接口向微信支付提交投诉处理回复。
步骤15: 商户在没有接收到微信投诉通知的情况下可主动调用 查询投诉单详情 查询投诉单处理结果。
3.2. API接入(含示例代码) 文档展示了如何使用微信支付服务端 SDK 快速接入支付有礼,完成与微信支付对接的部分。
3.2.1. 【服务端】查询投诉单列表 步骤说明 :商户可通过调用此接口,查询指定时间段的所有用户投诉信息,以分页输出查询结果。
1 public void GetComplaintsList ( ) throws Exception {
2
3 HttpGet httpGet = new HttpGet ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2?limit=5&offset=10&begin_date=2019-01-01&end_date=2019-01-01&complainted_mchid=190000XXXX" ) ;
4 httpGet . setHeader ( "Accept" , "application/json" ) ;
5
6
7 CloseableHttpResponse response = httpClient . execute ( httpGet ) ;
8
9 try {
10 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
11 if ( statusCode == 200 ) {
12 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
13 } else if ( statusCode == 204 ) {
14 System . out . println ( "success" ) ;
15 } else {
16 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
17 throw new IOException ( "request failed" ) ;
18 }
19 } finally {
20 response . close ( ) ;
21 }
22 } PHP
1 try {
2 $resp = $client - >request (
3 'GET' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2?limit=5&offset=10&begin_date=2019-01-01&end_date=2019-01-01&complainted_mchid=190000XXXX' ,
5 [
6 'headers' = > [ 'Accept' = > 'application/json' ]
7 ]
8 ) ;
9 $statusCode = $resp - >getStatusCode ( ) ;
10 if ( $statusCode == 200 ) {
11 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
12 } else if ( $statusCode == 204 ) {
13 echo " success" ;
14 }
15 } catch ( RequestException $e ) {
16
17 echo $e - >getMessage ( ) . " \n" ;
18 if ( $e - >hasResponse ( ) ) {
19 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
20 }
21 return ;
22 }
3.2.2.【服务端】查询投诉单详情 步骤说明:商户可通过调用此接口,查询指定投诉单的用户投诉详情,包含投诉内容、投诉关联订单、投诉人联系方式等信息,方便商户处理投诉。
JAVA
1 public void GetComplaintsInfo ( ) throws Exception {
2
3 HttpGet httpGet = new HttpGet ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/200201820200101080076610000" ) ;
4 httpGet . setHeader ( "Accept" , "application/json" ) ;
5
6
7 CloseableHttpResponse response = httpClient . execute ( httpGet ) ;
8
9 try {
10 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
11 if ( statusCode == 200 ) {
12 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
13 } else if ( statusCode == 204 ) {
14 System . out . println ( "success" ) ;
15 } else {
16 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
17 throw new IOException ( "request failed" ) ;
18 }
19 } finally {
20 response . close ( ) ;
21 }
22 } 1 try {
2 $resp = $client - >request (
3 'GET' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/200201820200101080076610000' ,
5 [
6 'headers' = > [ 'Accept' = > 'application/json' ]
7 ]
8 ) ;
9 $statusCode = $resp - >getStatusCode ( ) ;
10 if ( $statusCode == 200 ) {
11 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
12 } else if ( $statusCode == 204 ) {
13 echo " success" ;
14 }
15 } catch ( RequestException $e ) {
16
17 echo $e - >getMessage ( ) . " \n" ;
18 if ( $e - >hasResponse ( ) ) {
19 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
20 }
21 return ;
22 }
3.2.3. 【服务端】查询投诉协商历史 步骤说明: 商户可通过调用此接口,查询指定投诉的用户商户协商历史,以分页输出查询结果,方便商户根据处理历史来制定后续处理方案。
JAVA
1 public void GetComplaintsHis ( ) throws Exception {
2
3 HttpGet httpGet = new HttpGet ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/200201820200101080076610000/negotiation-historys?limit=50&offset=10" ) ;
4 httpGet . setHeader ( "Accept" , "application/json" ) ;
5
6
7 CloseableHttpResponse response = httpClient . execute ( httpGet ) ;
8
9 try {
10 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
11 if ( statusCode == 200 ) {
12 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
13 } else if ( statusCode == 204 ) {
14 System . out . println ( "success" ) ;
15 } else {
16 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
17 throw new IOException ( "request failed" ) ;
18 }
19 } finally {
20 response . close ( ) ;
21 }
22 } 1 try {
2 $resp = $client - >request (
3 'GET' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/200201820200101080076610000/negotiation-historys?limit=50&offset=10' ,
5 [
6 'headers' = > [ 'Accept' = > 'application/json' ]
7 ]
8 ) ;
9 $statusCode = $resp - >getStatusCode ( ) ;
10 if ( $statusCode == 200 ) {
11 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
12 } else if ( $statusCode == 204 ) {
13 echo " success" ;
14 }
15 } catch ( RequestException $e ) {
16
17 echo $e - >getMessage ( ) . " \n" ;
18 if ( $e - >hasResponse ( ) ) {
19 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
20 }
21 return ;
22 } 重要入参说明:
3.2.4. 【服务端】投诉通知回调 步骤说明: 商户创建投诉通知回调URL 后,当有新的投诉事件发生、投诉状态发生变化时,商户会收到通知回调。商户需要接收处理,并按文档规范返回应答。
注意
投诉通知是以POST 方法访问商户设置的通知URL,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。
加密不能保证通知请求来自微信。微信会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考 《微信支付API v3签名验证》 。
投诉通知HTTP应答码为200或204才会当作正常接收,当回调处理异常时,应答的HTTP状态码应为500,或者4xx。
商户成功接收到回调通知后应返回成功的HTTP应答码为200或204。
同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
3.2.5. 【服务端】创建投诉通知回调地址 步骤说明: 商户通过调用此接口创建投诉通知回调URL,当用户产生新投诉且投诉状态已变更时,微信支付会通过回调URL通知商户。
JAVA
1 public void CreateComplaintsNotify ( ) throws Exception {
2
3 HttpPost httpPost = new HttpPost ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications" ) ;
4
5 String reqdata = "{"
6 + "\"url\":\"https://www.xxx.com/notify\""
7 + "}" ;
8 StringEntity entity = new StringEntity ( reqdata , "utf-8" ) ;
9 entity . setContentType ( "application/json" ) ;
10 httpPost . setEntity ( entity ) ;
11 httpPost . setHeader ( "Accept" , "application/json" ) ;
12
13
14 CloseableHttpResponse response = httpClient . execute ( httpPost ) ;
15
16 try {
17 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
18 if ( statusCode == 200 ) {
19 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
20 } else if ( statusCode == 204 ) {
21 System . out . println ( "success" ) ;
22 } else {
23 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
24 throw new IOException ( "request failed" ) ;
25 }
26 } finally {
27 response . close ( ) ;
28 }
29 } 1 try {
2 $resp = $client - >request (
3 'POST' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications' ,
5 [
6
7 'json' = > [
8 " url" = > " https://www.xxx.com/notify" ,
9 ] ,
10 'headers' = > [ 'Accept' = > 'application/json' ]
11 ]
12 ) ;
13 $statusCode = $resp - >getStatusCode ( ) ;
14 if ( $statusCode == 200 ) {
15 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
16 } else if ( $statusCode == 204 ) {
17 echo " success" ;
18 }
19 } catch ( RequestException $e ) {
20
21 echo $e - >getMessage ( ) . " \n" ;
22 if ( $e - >hasResponse ( ) ) {
23 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
24 }
25 return ;
26 }
3.2.6.【服务端】查询投诉通知回调地址 步骤说明: 商户通过调用此接口查询投诉通知的回调URL。
JAVA
1 public void GetComplaintsNotify ( ) throws Exception {
2
3 HttpGet httpGet = new HttpGet ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications" ) ;
4 httpGet . setHeader ( "Accept" , "application/json" ) ;
5
6
7 CloseableHttpResponse response = httpClient . execute ( httpGet ) ;
8
9 try {
10 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
11 if ( statusCode == 200 ) {
12 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
13 } else if ( statusCode == 204 ) {
14 System . out . println ( "success" ) ;
15 } else {
16 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
17 throw new IOException ( "request failed" ) ;
18 }
19 } finally {
20 response . close ( ) ;
21 }
22 } 1 try {
2 $resp = $client - >request (
3 'GET' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications' ,
5 [
6 'headers' = > [ 'Accept' = > 'application/json' ]
7 ]
8 ) ;
9 $statusCode = $resp - >getStatusCode ( ) ;
10 if ( $statusCode == 200 ) {
11 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
12 } else if ( $statusCode == 204 ) {
13 echo " success" ;
14 }
15 } catch ( RequestException $e ) {
16
17 echo $e - >getMessage ( ) . " \n" ;
18 if ( $e - >hasResponse ( ) ) {
19 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
20 }
21 return ;
22 }
3.2.7. 【服务端】更新投诉通知回调地址 步骤说明: 商户通过调用此接口创建投诉通知回调URL,当用户产生新投诉且投诉状态已变更时,微信支付会通过回 调URL通知商户。
JAVA
1 public void UpdateComplaintsNotify ( ) throws Exception {
2
3 HttpPut httpPut = new HttpPut ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications" ) ;
4
5 String reqdata = "{"
6 + "\"url\":\"https://www.123.com/notify\""
7 + "}" ;
8 StringEntity entity = new StringEntity ( reqdata , "utf-8" ) ;
9 entity . setContentType ( "application/json" ) ;
10 httpPut . setEntity ( entity ) ;
11 httpPut . setHeader ( "Accept" , "application/json" ) ;
12
13
14 CloseableHttpResponse response = httpClient . execute ( httpPut ) ;
15
16 try {
17 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
18 if ( statusCode == 200 ) {
19 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
20 } else if ( statusCode == 204 ) {
21 System . out . println ( "success" ) ;
22 } else {
23 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
24 throw new IOException ( "request failed" ) ;
25 }
26 } finally {
27 response . close ( ) ;
28 }
29 } 1 try {
2 $resp = $client - >request (
3 'PUT' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications' ,
5 [
6
7 'json' = > [
8 " url" = > " https://www.123.com/notify" ,
9 ] ,
10 'headers' = > [ 'Accept' = > 'application/json' ]
11 ]
12 ) ;
13 $statusCode = $resp - >getStatusCode ( ) ;
14 if ( $statusCode == 200 ) {
15 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
16 } else if ( $statusCode == 204 ) {
17 echo " success" ;
18 }
19 } catch ( RequestException $e ) {
20
21 echo $e - >getMessage ( ) . " \n" ;
22 if ( $e - >hasResponse ( ) ) {
23 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
24 }
25 return ;
26 }
3.2.8. 【服务端】删除投诉通知回调地址 步骤说明: 商户通过调用此接口查询投诉通知的回调URL。
JAVA
1 public void DelComplaintsNotify ( ) throws Exception {
2
3 HttpDelete httpDel = new HttpDelete ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications" ) ;
4 httpDel . setHeader ( "Accept" , "application/json" ) ;
5
6
7 CloseableHttpResponse response = httpClient . execute ( httpDel ) ;
8
9 try {
10 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
11 if ( statusCode == 200 ) {
12 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
13 } else if ( statusCode == 204 ) {
14 System . out . println ( "success" ) ;
15 } else {
16 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
17 throw new IOException ( "request failed" ) ;
18 }
19 } finally {
20 response . close ( ) ;
21 }
22 } 1 try {
2 $resp = $client - >request (
3 'DELETE' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications' ,
5 [
6 'headers' = > [ 'Accept' = > 'application/json' ]
7 ]
8 ) ;
9 $statusCode = $resp - >getStatusCode ( ) ;
10 if ( $statusCode == 200 ) {
11 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
12 } else if ( $statusCode == 204 ) {
13 echo " success" ;
14 }
15 } catch ( RequestException $e ) {
16
17 echo $e - >getMessage ( ) . " \n" ;
18 if ( $e - >hasResponse ( ) ) {
19 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
20 }
21 return ;
22 }
3.2.9. 【服务端】提交回复 步骤说明:商户可调用此接口回复用户。其中上传图片凭证需首先调用 商户上传反馈图片 接口,得到图片ID,再将ID填入请求。
JAVA
1 public void ReplyInfo ( ) throws Exception {
2
3 HttpPost httpPost = new HttpPost ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/200201820200101080076610000/response" ) ;
4
5 String reqdata = "{"
6 + "\"complainted_mchid\":190001XXX,"
7 + "\"response_content\":\"已与用户沟通解决\","
8 + "\"response_images\": ["
9 + "\"0\":\"8692450418652C00E4E623AF421E00B5.png\""
10 + "]"
11 + "}" ;
12 StringEntity entity = new StringEntity ( reqdata , "utf-8" ) ;
13 entity . setContentType ( "application/json" ) ;
14 httpPost . setEntity ( entity ) ;
15 httpPost . setHeader ( "Accept" , "application/json" ) ;
16
17
18 CloseableHttpResponse response = httpClient . execute ( httpPost ) ;
19
20 try {
21 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
22 if ( statusCode == 200 ) {
23 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
24 } else if ( statusCode == 204 ) {
25 System . out . println ( "success" ) ;
26 } else {
27 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
28 throw new IOException ( "request failed" ) ;
29 }
30 } finally {
31 response . close ( ) ;
32 }
33 } 1 try {
2 $resp = $client - >request (
3 'POST' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/200201820200101080076610000/response' ,
5 [
6
7 'json' = > [
8 " complainted_mchid" = > 190001 XXX ,
9 " response_content" = > " 已与用户沟通解决" ,
10 " response_images" = > [
11 " 0" = > " 8692450418652C00E4E623AF421E00B5.png" ,
12 ]
13 ] ,
14 'headers' = > [ 'Accept' = > 'application/json' ]
15 ]
16 ) ;
17 $statusCode = $resp - >getStatusCode ( ) ;
18 if ( $statusCode == 200 ) {
19 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
20 } else if ( $statusCode == 204 ) {
21 echo " success" ;
22 }
23 } catch ( RequestException $e ) {
24
25 echo $e - >getMessage ( ) . " \n" ;
26 if ( $e - >hasResponse ( ) ) {
27 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
28 }
29 return ;
30 } complaint_id: 投诉单对应的投诉单号。
complainted_mchid: 被诉商户号,投诉单对应的被诉商户号。
response_content: 回复内容,具体的投诉处理方案,限制200个字符以内。
更多参数、响应详情及错误码请参见 提交回复 接口文档。
3.2.10. 【服务端】反馈处理完成 步骤说明: 商户可通过调用此接口,反馈投诉单已处理完成。
JAVA
1 public void CompleteComplaints ( ) throws Exception {
2
3 HttpPost httpPost = new HttpPost ( "https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/200201820200101080076610000/complete" ) ;
4
5 String reqdata = "{"
6 + "\"complainted_mchid\":190001XXX"
7 + "}" ;
8 StringEntity entity = new StringEntity ( reqdata , "utf-8" ) ;
9 entity . setContentType ( "application/json" ) ;
10 httpPost . setEntity ( entity ) ;
11 httpPost . setHeader ( "Accept" , "application/json" ) ;
12
13
14 CloseableHttpResponse response = httpClient . execute ( httpPost ) ;
15
16 try {
17 int statusCode = response . getStatusLine ( ) . getStatusCode ( ) ;
18 if ( statusCode == 200 ) {
19 System . out . println ( "success,return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
20 } else if ( statusCode == 204 ) {
21 System . out . println ( "success" ) ;
22 } else {
23 System . out . println ( "failed,resp code = " + statusCode + ",return body = " + EntityUtils . toString ( response . getEntity ( ) ) ) ;
24 throw new IOException ( "request failed" ) ;
25 }
26 } finally {
27 response . close ( ) ;
28 }
29 } 1 try {
2 $resp = $client - >request (
3 'POST' ,
4 'https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/200201820200101080076610000/complete' ,
5 [
6
7 'json' = > [
8 " complainted_mchid" = > 190001 XXX ,
9 ] ,
10 'headers' = > [ 'Accept' = > 'application/json' ]
11 ]
12 ) ;
13 $statusCode = $resp - >getStatusCode ( ) ;
14 if ( $statusCode == 200 ) {
15 echo " success,return body = " . $resp - >getBody ( ) - >getContents ( ) . " \n" ;
16 } else if ( $statusCode == 204 ) {
17 echo " success" ;
18 }
19 } catch ( RequestException $e ) {
20
21 echo $e - >getMessage ( ) . " \n" ;
22 if ( $e - >hasResponse ( ) ) {
23 echo " failed,resp code = " . $e - >getResponse ( ) - >getStatusCode ( ) . " return body = " . $e - >getResponse ( ) - >getBody ( ) . " \n" ;
24 }
25 return ;
26 }
3.2.11. 【服务端】商户上传反馈图片 步骤说明: 商户上传反馈图片的接口。 将媒体图片进行二进制转换,得到的媒体图片二进制内容,在请求body中上传此二进制内容。 媒体图片只支持jpg、png、bmp格式,文件大小不能超过2M。
JAVA
1 String filePath = "/your/home/hellokitty.png" ;
2 URI uri = new URI ( "https://api.mch.weixin.qq.com/v3/merchant-service/images/upload" ) ;
3 File file = new File ( filePath ) ;
4
5 try ( FileInputStream ins1 = new FileInputStream ( file ) ) {
6 String sha256 = DigestUtils . sha256Hex ( ins1 ) ;
7 try ( InputStream ins2 = new FileInputStream ( file ) ) {
8 HttpPost request = new WechatPayUploadHttpPost . Builder ( uri )
9 . withImage ( file . getName ( ) , sha256 , ins2 )
10 . build ( ) ;
11 CloseableHttpResponse response1 = httpClient . execute ( request ) ;
12 }
13 } 1 try {
2 $resp = $client - >request ( 'POST' , 'https://api.mch.weixin.qq.com/v3/merchant-service/images/upload' , [
3 'body' = > $media - >getStream ( ) ,
4 'headers' = > [
5 'Accept' = > 'application/json' ,
6 'content-type' = > $media - >getContentType ( ) ,
7 ]
8 ] ) ;
9
10 $resp = $client - >post ( 'merchant-service/images/upload' , [
11 'body' = > $media - >getStream ( ) ,
12 'headers' = > [
13 'Accept' = > 'application/json' ,
14 'content-type' = > $media - >getContentType ( ) ,
15 ]
16 ] ) ;
17 echo $resp - >getStatusCode ( ) . ' ' . $resp - >getReasonPhrase ( ) . " \n" ;
18 echo $resp - >getBody ( ) . " \n" ;
19 } catch ( Exception $e ) {
20 echo $e - >getMessage ( ) . " \n" ;
21 if ( $e - >hasResponse ( ) ) {
22 echo $e - >getResponse ( ) - >getStatusCode ( ) . ' ' . $e - >getResponse ( ) - >getReasonPhrase ( ) . " \n" ;
23 echo $e - >getResponse ( ) - >getBody ( ) ;
24 }
25 return ;
26 }
4. 常见问题
Q:商户反馈API,查询投诉单列表 API频率是多少? A:商户反馈API每分钟60次,查询投诉单列表 API频率是每分钟200次。
Q:商户反馈API,商户传给微信侧的反馈和留言是同步实时处理的吗?
Q:投诉通知回调API中的通知ID,在重复通知的情况下,ID是一致的吗? A:微信存在重复通知的情况,关于重复通知的客户投诉,通知ID是一致的。
Q:设置了投诉通知URL,存在用户投诉,但收不到投诉通知的情况,如何解决? 请检查回调URL是否能正常公网访问,不能是中文域名,不能是HTTP,必须是HTTPS;
请注意回调URL不能携带参数;
请检查是否开启了防火墙,如果开启了防火墙,请添加 微信支付回调IP ;
请检查设置通知URL的商户号与投诉订单的商户号是否为同一个;
APIv3密钥没有设置,设置路径:【 微信商户平台 —>账户设置—>API安全—>设置APIv3密钥】。