参考 H5支付文档 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1
1.发送请求所需要的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
let key = "ORM1NEK98XXXXXX3JJAITO6EB14W274ZH";
let h5Obj = { appid: "wxddxx8xx48c19xxxsdsbdcb", body: "xx-商品", mch_id: "1579347061", nonce_str: randomString(), notify_url: "https://www.baidu.com/", out_trade_no: randomString(), spbill_create_ip: ip, total_fee: total, trade_type: "MWEB", scene_info: '{"h5_info":{"type":"Wap","wap_url":"支付的域名www.baidu.com","wap_name":"订单"}}', };
|
2.用户IP地址获取
1 2
| let url = 'https://pv.sohu.com/cityjson?ie=utf-8'
|
3.如何进行sign签名?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| let reStr = sortStr(h5Obj, false, key);
let sign = nodeMd5(reStr).toUpperCase();
let formData = `<xml> <appid>${h5Obj.appid}</appid> <body>${h5Obj.body}</body> <mch_id>${h5Obj.mch_id}</mch_id> <nonce_str>${h5Obj.nonce_str}</nonce_str> <notify_url>${h5Obj.notify_url}</notify_url> <out_trade_no>${h5Obj.out_trade_no}</out_trade_no> <spbill_create_ip>${h5Obj.spbill_create_ip}</spbill_create_ip> <total_fee>${h5Obj.total_fee}</total_fee> <trade_type>${h5Obj.trade_type}</trade_type> <scene_info>${h5Obj.scene_info}</scene_info> <sign>${sign}</sign> </xml>`; return { h5Obj, formData, };
|
(1).排序方法(根据ASCII进行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
const sortStr = (params, ttKey, h5Key) => { const paramKeys = Object.keys(params).sort(); let signStr = ""; paramKeys.forEach((key) => { let value = params[key]; if (!value || ["risk_info", "sign"].indexOf(key) >= 0) { return; } if (signStr.length > 0) { signStr += "&"; } if (typeof value === "object") { value = JSON.stringify(value); } signStr += key + "=" + value; }); if (ttKey) { signStr += `${ttKey}`; return signStr; } if (h5Key) { signStr += "&key=" + h5Key; return signStr; } }; export default sortStr;
|
(2)签名方法node版(如果不能使用 后面有js版)
1 2 3 4 5 6 7
| const crypto = require("crypto"); const createSign = (signStr) => { const md5 = crypto.createHash("md5"); const sign = md5.update(signStr).digest("hex"); return sign; }; export default createSign;
|
(3)随机字符方法
1 2 3 4 5 6 7 8 9 10 11 12
| function randomString() { let chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678"; let maxPos = chars.length; let pwd = ""; for (let i = 0; i < 32; i++) { pwd += chars.charAt(Math.floor(Math.random() * maxPos)); } return pwd; } export default randomString;
|
4.封装支付方法 (vue可用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import sortStr from "../MD5/sortStr/sortStr";
import nodeMd5 from "../MD5/nodeMd5";
import randomString from "../randomString/randomString";
let h5PayFn = { h5Pay(total = 100, ip = "127.0.0.1") { } } export default h5PayFn;
|
1 2 3 4 5
| import h5PayFn from "./H5pay"; Vue.prototype.$utils = { ...h5PayFn, };
|
5.使用
1 2 3 4 5 6 7 8 9 10
| let { h5Obj, formData } = this.$utils.h5Pay(100, this.ip);
let out = h5Obj.out_trade_no;
this.$utils.flypost("https://api.mch.weixin.qq.com/pay/unifiedorder", formData) .then((res) => { console.log(res); }).catch()
|
6.常见报错
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
1.商家存在未配置的参数,请联系商家解决
一般是因为微信后台未配置支付的域名 , 这个一定要注意 ,有的可能一个微信绑定多个商户号! ,要确保配置正确
jsMD5排序
MD5加密JS排序
仅供参考