1.下面我说的是h5在小程序内部调取微信支付。
微信支付的步骤:参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
2.1 查看h5调起微信支付
所需参数:
这些参数是由 后台请求微信 统一下单 API 获取的
请求微信统一下单API:其中有个必填字段
通知地址 | notify_url | 是 | String(256) | http://www.weixin.qq.com/wxpay/pay.php | 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 |
用来接收微信支付成功后 通知服务端的地址
用户标识 | openid | 否 | String(128) | oUpF8uMuAJO_M2pxb1Q9zNjWeS6o | trade_type=JSAPI时(即JSAPI支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换 |
如果H5获取不到用户的openId,那么我们需要通过code码获取去用户的openId返回给前端,用户调用统一下单接口时,再传回来。获取详情参考微信开发文档。
3.根据微信开发文档,访问统一下单接口,访问成功后,根据返回参数拼接 H5所需参数
需要注意:
"package":"prepay_id=u802345jgfjsdfgsdg888",
这个参数格式有点不一样,需要注意
对参数进行MD5加签加密,加密方式参考微信开发文档,这里我贴出我个人写拼装参数与加密方法
SortedMap<String, String> resp = new TreeMap<String, String>();
resp.put("appId", result.get("APPID"));
resp.put("timeStamp",String.valueOf(Instant.now().getEpochSecond()));
resp.put("nonceStr", result.get("NONCE_STR"));
resp.put("package", "prepay_id="+result.get("PREPAY_ID"));
resp.put("signType", "MD5");
String paySign = PayCommonUtil.getSign(resp);
resp.put("paySign", paySign);
4.加密工具类PayCommonUtil
package com.newland.common.utils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.tencent.common.Configure;
/**
* 微信支付成功回调工具类
* 服务号相关信息
*/
public class PayCommonUtil {
/**
* 加签,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
*
* @return boolean
*/
public static String getSign(SortedMap<String, String> packageParams) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (!"sign".equals(k) && null != v && !"".equals(v)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + Configure.getKey());
//算出摘要
String mysign = EncodeUtils.encodeMD5(sb.toString(),"UTF-8").toUpperCase();
return mysign;
}
}
5.当我们拼接好H5需要的参数返回给H5后。由H5调起微信支付,微信支付成功后,微信调用我们下单传入的参数notify_url的地址通知我们微信支付的结果。后面我会讲解微信支付回调。
6.微信支付回调地址:https://blog.csdn.net/qq_38669394/article/details/106667053