欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  互联网

字节跳动接入微信h5支付

程序员文章站 2022-03-10 18:20:38
字节跳动接入微信h5支付1.准备工作1.需要条件 微信的appid 商户号 key(做为微信生成签名的参数) 微信的回调地址(你公司域名下的接口)2.字节跳动申请的appid,商户号,key (做为生产orderinfo签名的参数)3.微信申请的h5支付域名必须为snssdk.com (字节跳动的网址)4.微信支付的ip必须要动态获取,不然会出现商家参数有误的问题5.字节跳动接口中回调url必须为https://tp-pay.snssdk.com/paycallback6.注意微信支付拿到的...

字节跳动接入微信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

相关标签: 工作BUG