springboot集成微信支付服务商版之小程序支付


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;
    }

了解更多资讯,请关注此公众号!!!
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值