为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,我们推出了全新的微信支付APIv3接口。该版本API的具体规则请参考“APIv3接口规则”
备注:当前接口用于微信国内钱包
为了帮助开发者调用开放接口,我们提供了JAVA、PHP、GO三种语言版本的开发库,封装了签名生成、签名验证、敏感信息加/解密、媒体文件上传等基础功能(更多语言版本的开发库将在近期陆续提供)
测试步骤:
1、根据自身开发语言,选择对应的开发库并构建项目,具体配置请参考下面链接的详细说明:
• wechatpay-java(推荐)wechatpay-apache-httpclient,适用于Java开发者。
• wechatpay-php(推荐)、wechatpay-guzzle-middleware,适用于PHP开发者
注:当前开发指引接口PHP示例代码采用wechatpay-guzzle-middleware版本
• wechatpay-go,适用于Go开发者
更多资源可前往微信支付开发者社区搜索查看
2、创建加载商户私钥、加载平台证书、初始化httpClient的通用方法
@Before
public void setup() throws IOException {
// 加载商户私钥(privateKey:私钥字符串)
PrivateKey merchantPrivateKey = PemUtil
.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
// 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
// 初始化httpClient
httpClient = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier)).build();
}
@After
public void after() throws IOException {
httpClient.close();
}
3、基于接口的示例代码,替换请求参数后可发起测试
说明:
• 上面的开发库为微信支付官方开发库,其它没有审核或者控制下的第三方工具和库,微信支付不保证它们的安全性和可靠性
通过包管理工具引入SDK后,可根据下面每个接口的示例代码替换相关参数后进行快速测试
• 开发者如果想详细了解签名生成、签名验证、敏感信息加/解密、媒体文件上传等常用方法的具体代码实现,可阅读下面的详细说明:
1.签名生成
2.签名验证
3.敏感信息加解密
• 如想更详细的了解我们的接口规则,可查看我们的接口规则指引文档
步骤4 商户调用《建立合作关系》接口,将指定优惠券批次(支付券或商家券)授权给指定APPID
步骤7 用户在商家小程序直播间,可领取对应优惠券;(优惠券领取后,自动插入用户微信卡包)
文档展示了如何使用微信支付服务端 SDK 快速接入委托营销产品,完成与微信支付对接的部分。
注意:
步骤说明:该接口主要为商户提供营销资源的授权能力,可授权给其他商户或小程序,方便商户间的互利合作。
示例代码:
public void BuildRelations() throws Exception{
//请求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/partnerships/build");
// 请求body参数
String reqdata = "{"
+ "\"authorized_data\": {"
+ "\"business_type\":\"FAVOR_STOCK\","
+ "\"stock_id\":\"2433405\""
+ "},"
+ "\"partner\": {"
+ "\"appid\":\"wx4e1916a585d1f4e9\","
+ "\"type\":\"APPID\""
+ "}"
+ "}";
StringEntity entity = new StringEntity(reqdata,"utf-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Idempotency-Key","12345");
//完成签名并执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) { //处理成功
System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
} else if (statusCode == 204) { //处理成功,无返回Body
System.out.println("success");
} else {
System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
throw new IOException("request failed");
}
} finally {
response.close();
}
}
重要入参说明:
• type:合作方类别,枚举值:
APPID:合作方为APPID
MERCHANT:合作方为商户
• business_type:授权业务类别,枚举值:
FAVOR_STOCK:代金券批次
BUSIFAVOR_STOCK:商家券批次
更多参数、响应详情及错误码请参见建立合作关系接口文档
步骤说明:该接口主要为商户提供合作关系列表的查询能力。
示例代码:
public void QueryRelations() throws Exception{
//请求URL
HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/partnerships?authorized_data=%7b%22business_type%22%3a%22BUSIFAVOR_STOCK%22%7d&partner=%7b%22type%22%3a%22APPID%22%7d&offset=0&limit=5");
httpGet.setHeader("Accept", "application/json");
//完成签名并执行请求
CloseableHttpResponse response = httpClient.execute(httpGet);
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) { //处理成功
System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
} else if (statusCode == 204) { //处理成功,无返回Body
System.out.println("success");
} else {
System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
throw new IOException("request failed");
}
} finally {
response.close();
}
}
重要入参说明:
• business_type:授权业务类别,枚举值:
FAVOR_STOCK:代金券批次
BUSIFAVOR_STOCK:商家券批次
更多参数、响应详情及错误码请参见查询合作关系列表接口文档
A:请按照以下几点检查:
1. appid或mch_id填写错误,请确认appid和mch_id是否正确
2. appid与mch_id未绑定,请绑定后再调用接口,绑定步骤请参考《绑定指引》文档
A商户号不存在,请确认请求头中的商户号是否正确或者是否有空格
A:请按照以下几点检查:
1. 签名与生成Authorization用的同一个时间戳跟随机串
2. 构造签名串时,里面的url不需要ToLowCase(),不用UrlEncode(),商户请求的url后缀是什么,签名用的url后缀就是什么
3. 查询订单使用的是GET,构建签名串时,里面的请求报文为空且需要换行符
4. 检查证书和商户号是否正确,如为服务商模式,则需使用服务商的相关证书。签名相关问题请参考《接口规则》文档
A:请求头中的API证书序列号错误,请排查确认。证书序列号查看路径:【商户平台->API安全->API证书->查看证书】
A:Http头缺少Accept或User-Agent,请根据V3接口规则内容进行排查