小程序支付+回调+查询订单记录

一丶查看官方开发文档,地址为:

链接: https://pay.weixin.qq.com/wiki/doc/api/index.html.

二丶回传前端发起支付的参数
/**
     *调用统一下单接口,并接受返回的结果
     * @param openid    用户唯一标识(详情请看微信登录)
     * @param money     金额
     * @param orderNum  订单号
     * @return
     */
     public static Map<String, String> getPayment(String openid,double money,String orderNum) throws Exception {

         //初始化返回值
         Map<String,String> payMap = new TreeMap<>();
         //获取32位随机字符串
         String nonce_str = PayUtil.getRandomStringByLength(32);
         //商品描述 这里是避免出现中文乱码
         String body = new String(WeChatConfigVo.body.getBytes(StandardCharsets.ISO_8859_1));
         //封装数据
         SortedMap<String,String> map = new TreeMap<>();
         map.put("appid", WeChatConfigVo.appId);
         map.put("mch_id", WeChatConfigVo.mch_id);
         map.put("nonce_str", nonce_str);
         map.put("body", body);
         map.put("out_trade_no", orderNum);                          //商户订单号,自己的订单ID
         map.put("total_fee", PayUtil.moneyToIntegerStr(money));  //支付金额,这边需要转成字符串类型,否则后面的签名会失败
         map.put("spbill_create_ip", IPUtils.getIpAddr());         //IP地址
         map.put("notify_url", WeChatConfigVo.notify_url);        //支付成功后的回调地址
         map.put("trade_type", WeChatConfigVo.tradeType);        //支付方式
         map.put("openid", openid);

         //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
         String preStr = PayUtil.createLinkString(map);
         //MD5运算生成签名,这里是第一次签名,用于调用统一下单接口
         String mySign = PayUtil.sign(preStr, WeChatConfigVo.key, "utf-8").toUpperCase();
         //放到map集合
         map.put("sign",mySign);
         //装换为xml
         String mapXML = PayUtil.mapToXml(map);
         //调用统一下单接口,并接受返回的结果
         String result = PayUtil.httpRequest(WeChatConfigVo.pay_url, "POST", mapXML);
         //解析xml返回map集合
         Map mapResult = PayUtil.xmlToMap(result);
         //获取返回状态码和返回结果
         String return_code = (String) mapResult.get("return_code");
         String result_code = (String) mapResult.get("result_code");
         //判断是否成功
         if("SUCCESS".equals(return_code) || return_code.equals(result_code)){
             //成功返回预订单ID
             String prepay_id = (String) mapResult.get("prepay_id");
             //获取当前时间戳
             String timeStamp = PayUtil.getCurrentTimeStamp();
             //封装返回结果
             payMap.put("nonceStr", nonce_str);
             payMap.put("package", prepay_id);
             //要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
             payMap.put("timeStamp", timeStamp);
             //拼接签名需要的参数
             String stringSignTemp = "appId=" + WeChatConfigVo.appId + "&nonceStr=" + nonce_str + "&package=prepay_id="
                     + prepay_id + "&signType=" + WeChatConfigVo.signType + "&timeStamp=" + timeStamp;
             //再次签名,这个签名用于小程序端调用wx.requesetPayment方法
             String paySign = PayUtil.sign(stringSignTemp, WeChatConfigVo.key, "utf-8").toUpperCase();
             //封装到map集合
             payMap.put("paySign",paySign);
         }else {
             throw new ServiceException("支付失败");
         }
         payMap.put("appId", WeChatConfigVo.appId);
         //数据返回
         return payMap;
     }
3丶支付后会以流的方式回传数据(回调函数),生命回调函数是要以接口的形式编写,并在外网上可访问,而且接口不可携带参数
@Override
    public void wxNotify(HttpServletRequest request, HttpServletResponse response) {

        log.info("================回调正在执行===============");
        try {
            //获取缓冲流
            BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
            String line ;
            //获取StringBuilder对象
            StringBuilder sb = new StringBuilder();
            //拼接字符
            while ((line = br.readLine()) != null){
                sb.append(line);
            }
            br.close();
            //sb为微信返回的xml
            String notifyXml = sb.toString();
            //将xml转换为map对象
            Map<String,String> map = PayUtil.xmlToMap(notifyXml);
            log.info("===============准备读取=================");
            //获取return_code值 作为判断条件
            String returnCode = map.get("return_code");
            log.info("=====参数返回:======="+""+returnCode+""+"===============");
            //String resultCode = map.get("result_code");
            String preXml ;
            //成功返回
            if("SUCCESS".equals(returnCode)){

                //判断验证签名是否正确
                log.info("==============进来了没-===================");
                //判断签名是否正确
                boolean flag = PayUtil.isSignatureValid(map, WeChatConfigVo.key);
                //如果正确进行下一步操作
                if(flag){
                    //订单号
                    String orderNum = map.get("out_trade_no");
                    //金额
                    String money = map.get("total_fee");
                    log.info("=====钱:===="+money+"=============");
                    //交易时间
                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值