springboot集成微信支付普通商户版之APP支付
一、说明:
通过引入依赖实现微信支付,是非常方便的,因为SDK已经封装了很多公共的操作,比如签名sign等;以前还会因为字段排序等问题导致签名错误,使用该SDK可以规避此类问题。
巨坑!!!请留意:如果是新开的微信商户号,设置API密钥一定要设置两遍,否则会大概率出现“签名错误”。
二、准备参数
1.appid:登陆微信公众平台获取,是申请微信支付时对应公众号的appid;
2.mch_id:商户id,登陆微信商户平台获取
3.商户key(API密钥);设置后不能查看,只能重置,所以要保存好,如果是已经设置过了,重置要注意影响范围
三、开发步骤
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.主体报文逻辑如下 ;注意:返回给前端的sign一定要重新生成,否则会报错
public Map<String,String> wechatpayAppPay() throws Exception {
//设置支付参数
WXPay wxPay = new WXPay(myWechatpayConfig, WXPayConstants.SignType.MD5,myWechatpayConfig.getUseSandbox());
Map<String,String> map = new HashMap();
map.put("body", "你的标题");//
map.put("out_trade_no","商户订单号");
map.put("total_fee","金额");
map.put("spbill_create_ip","ip");
map.put("notify_url","异步回调地址");
map.put("trade_type","APP");
Map<String,String> resultMap = wxPay.unifiedOrder(map);
Map<String,String> payMap = new HashMap<>();
if("SUCCESS".equals(resultMap.get("return_code"))){
if("SUCCESS".equals(resultMap.get("result_code"))){
payMap.put("appid",resultMap.get("appid"));
payMap.put("partnerid",resultMap.get("mch_id"));
payMap.put("prepayid",resultMap.get("prepay_id"));
payMap.put("noncestr",WXPayUtil.generateNonceStr());
payMap.put("package","Sign=WXPay");
payMap.put("timestamp",String.valueOf(System.currentTimeMillis()/1000).substring(0, 10));
//重新生成sign
String paySign = WXPayUtil.generateSignature(payMap, myWechatpayConfig.getKey());
payMap.put("sign",paySign);
}else{
payMap.put("errMsg",resultMap.get("err_code_des"));
}
}else{
payMap.put("errMsg",resultMap.get("return_msg"));
}
return payMap;
}
4.回调处理;注意:一定要返回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;
}
了解更多资讯,请关注此公众号!!!