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