springboot集成微信支付服务商版之小程序支付
一、说明:
通过引入依赖实现微信支付,是非常方便的;
但是官方的SDK没有服务商版,以下是在原SDK的基础上封装了服务商版,共勉;
注:文中标识“巨坑”的地方,在开发过程中要特别注意;
巨坑!!!请留意:如果是新开的微信商户号,设置API密钥一定要设置两遍,否则会大概率出现“签名错误”
二、准备参数
1.特约商户创建的小程序;
2.配置特约商户APPID(所配置的APPID隶属小程序);
三、开发步骤
1.在pom.xml中引入依赖
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
2.在MyWechatpayConfig类实现sdk中的WXPayConfig(注意:以下配置要改为自己的)
public class MyWechatpayConfig implements WXPayConfig {
//服务商-appid
public String getAppID() {
return "wx112324223";
}
//服务商-商户号
public String getMchID() {
return "156988272323";
}
//服务商-API密钥
public String getKey() {
return "112233344566788754432dfdkjjhjkjd";
}
public InputStream getCertStream() {
return null;
}
public int getHttpConnectTimeoutMs() {
return 8000;
}
public int getHttpReadTimeoutMs() {
return 10000;
}
}
3.主体报文逻辑如下(
注意巨坑:
1.请求微信成功后再次加密时,appid隶属特约商户配置的小程序;
2.appId为驼峰;
)
/**
* 服务商版-小程序支付
* @param
*/
public Map<String,String> weChatPayAppletsPay() throws Exception {
//主要参数
MyWechatpayConfig myWechatpayConfig = new MyWechatpayConfig ();
WXPay wxPay = new WXPayUp(myWechatpayConfig );
//组装参数
//组装参数
Map<String,String> requestData = new HashMap<String, String>();
requestData.put("sub_appid","小程序的appid");
requestData.put("sub_mch_id","特约商户号");
requestData.put("sub_openid","用户对于小程序的唯一标识");
requestData.put("body","你的标语");
requestData.put("out_trade_no","商户系统内部订单号");
requestData.put("total_fee","订单总金额,单位为分,只能为整数");
requestData.put("spbill_create_ip","");
requestData.put("notify_url","异步回调地址");
requestData.put("trade_type","JSAPI");//固定值
//发起支付
Map<String, String> mapBack = wxPay.unifiedOrder(requestData);
Map<String,String> payMap = new HashMap();
if("SUCCESS".equals(mapBack.get("return_code"))){
if("SUCCESS".equals(mapBack.get("result_code"))){
//请求成功
payMap.put("appId","小程序的appid");
payMap.put("timeStamp",String.valueOf(System.currentTimeMillis()/1000).substring(0, 10));
payMap.put("nonceStr",WXPayUtil.generateNonceStr());
payMap.put("package","prepay_id="+resultMap.get("prepay_id"));
payMap.put("signType","MD5");
//重新生成sign
String paySign = WXPayUtil.generateSignature(payMap, myWechatpayConfig.getKey());
payMap.put("sign",paySign);
}else{
System.out.println("接口异常信息====="+mapBack.get("err_code_des"));
}
}else{
System.out.println("通信异常信息====="+mapBack.get("return_msg"));
}
return payMap;
}
4.第3步至此就获取到了小程序拉取微信客户端所需的参数
5.回调处理;注意:一定要返回xml格式的SUCCESS,不然会反复通知
public String wechatpayNotify(String notifyData) throws Exception {
// 支付结果通知的xml格式数据
WXPay wxpay = new WXPay(myWechatpayConfig);
// 转换成map
Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);
System.out.println("notifyMap==========="+notifyMap);
if("SUCCESS".equals(notifyMap.get("return_code"))) {
if ("SUCCESS".equals(notifyMap.get("result_code"))) {
//验签
if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
// 签名正确
// 进行处理
String out_trade_no = notifyMap.get("out_trade_no");//商户订单号
String transaction_id = notifyMap.get("transaction_id");//微信支付订单号
}else {
// 签名错误,如果数据里没有sign字段,也认为是签名错误
System.out.println("微信支付签名错误..................");
}
}
}
String backXml= "<xml>"+
"<return_code><![CDATA[SUCCESS]]></return_code>"+
"<return_msg><![CDATA[OK]]></return_msg>"+
"</xml>";
return backXml;
}
了解更多资讯,请关注此公众号!!!