字节跳动接入微信h5支付

字节跳动接入微信h5支付 有前后端代码

看别的博主也写了这个 地址

1.准备工作

1.需要条件 微信的appid  商户号 key(做为微信生成签名的参数) 微信的回调地址(你公司域名下的接口)
2.字节跳动申请的appid,商户号,key (做为生产orderinfo签名的参数)
3.微信申请的h5支付域名必须为snssdk.com (字节跳动的网址)
4.微信支付的ip必须要动态获取,不然会出现商家参数有误的问题
5.字节跳动接口中回调url必须为https://tp-pay.snssdk.com/paycallback
6.注意微信支付拿到的mweb_url后不要拼接跳转路径

2.流程

1.首先是跑通微信的h5支付
2.在字节跳动那个接口调用h5支付,把返回的mweb_url做为参数做成签名返回给前端 
3.前端需要在生成订单号的时候拿到订单号,做为查询订单状态接口的参数去查询支付结果    

3.代码实现

1.微信h5支付

1.微信h5
 public Map<String,String> orders_other(HttpServletRequest request,String body,BigDecimal total,Integer uid,String orderNo) { 
        try { 
            //拼接下单地址参数
            Map<String, String> paraMap = new HashMap<String, String>();
            //获取请求ip地址
            String ip = IpUtils.getIpAddr(request);
            paraMap.put("appid", "微信的appid");
            paraMap.put("mch_id", "微信的商户号");
            paraMap.put("nonce_str", WXPayUtil.generateNonceStr());
            paraMap.put("body", body);
            paraMap.put("out_trade_no", orderNo);//商品的订单号每次要唯一
            String total_fee=total.toString();
            paraMap.put("total_fee", total_fee);
            paraMap.put("spbill_create_ip", ip);
            paraMap.put("notify_url", "微信的回调地址");// 此路径是微信服务器调用支付结果通知路径
            paraMap.put("trade_type", "MWEB");
            paraMap.put("attach", uid.toString());
            paraMap.put("scene_info", "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"支付路径\",\"wap_name\": \"app名\"}}");


            String sign = WXPayUtil.generateSignature(paraMap, "微信的key");
            paraMap.put("sign", sign);
            String xml = WXPayUtil.mapToXml(paraMap);//将所有参数(map)转xml格式

            System.err.println(xml+"我是发送之前");
            // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
            String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

            String xmlStr = HttpUtilsYpl.doPost(unifiedorder_url,xml,4000);//发送post请求"统一下单接口"
            System.err.println(xmlStr+"=============");

            //以下内容是返回前端页面的json数据
            String mweb_url = "";//跳转链接
            if (xmlStr.indexOf("SUCCESS") != -1) { 
                Map<String, String> map = WXPayUtil.xmlToMap(xmlStr);
                mweb_url = (String) map.get("mweb_url");

                //支付完返回浏览器跳转的地址,如跳到查看订单页面
                //String redirect_url = "www.xxxxx.com/orders";
                //String redirect_urlEncode = URLEncoder.encode(redirect_url,"utf-8");//对上面地址urlencode
                //mweb_url = mweb_url + "&redirect_url=" + redirect_urlEncode;//拼接返回地址
            }
            Map<String, String> payMap = new HashMap<String, String>();
            payMap.put("mweb_url", mweb_url);
            return  payMap;
        } catch (Exception e) { 
            log.info("微信支付异常");
        }
        return null;

    }  

2.字节跳动orderinfo代码

 @GetMapping("/pay")
    public  Object microCheckoutCounter(HttpServletRequest request, Integer uid, BigDecimal total,String  subject,String body,String orderNo) { 
        Map<String, Object> parameters = new HashMap<>();
        //接口名称,是抖音的商户号
        parameters.put("merchant_id", "字节跳动商户号");
        //支付分配给业务方的ID,用于获取签名/验签的密钥信息,不是小程序appid
        parameters.put("app_id", "字节跳动appid");
        //商户生成签名字符串所使用的签名算法类型,目前支持MD5 RSA2
        parameters.put("sign_type", "MD5");
        //发送请求的时间,发送请求的时间,长整型的时间戳,单位是秒
        parameters.put("timestamp", Long.toString(System.currentTimeMillis() / 1000));
        //仅支持JSON
        parameters.put("product_code", "pay");
        parameters.put("trade_type", "H5");
        //请求使用的编码格式,如utf-8、gbk、gb2312等,目前只支持utf-8
        parameters.put("payment_type", "direct");
        //调用的接口版本,固定为:1.0
        parameters.put("version", "2.0");
        parameters.put("out_order_no", Long.toString(System.currentTimeMillis()));
        //请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,json格式
        parameters.put("uid", uid);
        //接口名称
        //记得把钱转换
        //String total_amount = YuanByFenUtil.yuanByFen(total,"100",2).toString();
        parameters.put("total_amount",total);
        //仅支持JSON
        parameters.put("currency", "CNY");
        //请求使用的编码格式,如utf-8、gbk、gb2312等,目前只支持utf-8
        //商品描述
        parameters.put("subject",subject);
        //商户生成签名字符串所使用的签名算法类型,目前支持MD5 RSA2
        //商品内容
        parameters.put("body", body);
        //发送请求的时间,发送请求的时间,长整型的时间戳,单位是秒
        parameters.put("trade_time", Long.toString(System.currentTimeMillis() / 1000));
        //调用的接口版本,固定为:1.0
        parameters.put("valid_time", "3600");
        parameters.put("notify_url", "https://tp-pay.snssdk.com/paycallback");
        //仅支持JSON

        Map map = orders_other(request,body,total,uid,orderNo);
        String wx_url = (String)map.get("mweb_url");
        parameters.put("wx_url", wx_url);
        //请求使用的编码格式,如utf-8、gbk、gb2312等,目前只支持utf-8
        parameters.put("wx_type", "MWEB");
        //商户生成签名字符串所使用的签名算法类型,目前支持MD5 RSA2

        String sign = PayCommonUtil.toutiaoAlipaySign(parameters, "字节跳动的key");
        //商户请求参数的签名串,详见签名方法
        parameters.put("sign", sign);


        parameters.put("risk_info", "{\"ip\":\"127.0.0.1\", \"device_id\":\"485737374363263\"}");
        System.out.println("parameters==="+parameters);

        return JsonResult.success(parameters);
    }

本文地址:https://blog.csdn.net/sqL520lT/article/details/110957773

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐