微信公众号H5支付(二)

微信公众号H5支付(一)

H5支付需要的东西都准备好后,就可以开始写了

服务端

因为访问微信统一下单链接的数据格式必须是xml,示例:

<xml>
<appid>wx2421b1c4370ec43b</appid>
<attach>支付测试</attach>
<body>H5支付测试</body>
<mch_id>10000100</mch_id>
<nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
<notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
<openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
<out_trade_no>1415659990</out_trade_no>
<spbill_create_ip>14.23.150.211</spbill_create_ip>
<total_fee>1</total_fee>
<trade_type>MWEB</trade_type>
<scene_info>{"h5_info": {"type":"IOS","app_name": "王者荣耀","package_name": "com.tencent.tmgp.sgame"}}</scene_info>
<sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>

我们可以直接通过拼接字符串的方式来生成xml格式的数据,但我觉得那样太麻烦了,还有就是可以将11个参数都封装成一个对象,再将对象传换成xml格式。

首先将微信统一下单需要用到的11个参数,都封装到Map集合

// 必填字段
 Map<String, String> data = new HashMap<>(11);
 String money = String.valueOf(price * 100);

 String wx_appid = appIdDict.getValue();
 String h5MchId = h5MchIdDict.getValue();
 data.put("appid",wx_appid);  // 公众号ID
 data.put("mch_id",h5MchId);  //商户号ID
 data.put("total_fee",money); //金额,单位是分
 data.put("spbill_create_ip",clientIp); //客户端IP地址
 data.put("trade_type","MWEB");		// H5固定类型
 data.put("nonce_str", WXPayUtil.generateNonceStr());  //随机字符串
 data.put("out_trade_no",outTradeNo);  //订单号
 data.put("body","测试支付");  // 商品描述

 // 回调地址,必须是外网可直接访问的地址
 String notifyUrl = "http://www.xxxx.com/h5CallBackTest/dealRequestResultTest";
 data.put("notify_url",notifyUrl);


 String scene_info = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"https://www.xxxx.com\",\"wap_name\": \"收银台\"}}";
 data.put("scene_info",scene_info);
 // API密钥
 String apiKey = h5ApiKeyDict.getValue();

 // 生成h5支付签名
 String sign = WXPayUtil.generateSignature(data,apiKey);
 data.put("sign",sign);
 // 通过微信支付工具类将MAP集合转成xml格式
 String requestXML = WXPayUtil.mapToXml(data);

然后就是调用微信H5统一下单接口了,通过httpClient,传地址,还有参数。(关于httpClient又是另一门学问,我了解的也不是很深,只知道是这样用的)

// 微信统一下单链接地址
String unifiedorder_url  = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// 微信会返回xml格式的字符串
 String xmlStr = HttpClientUtil.loadJsonHTTS(unifiedorder_url,requestXML,"text/xml");

微信会返回xml格式的字符串

错误信息,比如参数没有填写正确,公众号没有配置等等问题
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[商户号该产品权限预开通中,请等待产品开通后重试]]></return_msg>
</xml>


正确信息,说明填写的参数基本没什么问题
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<![CDATA[wx2421b1c4370ec43b]]>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
<![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
<trade_type><![CDATA[MWEB]]></trade_type>
<mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2016121516420242444321ca0631331346&package=1405458241]]></mweb_url>
</xml>

然后,如果是正确信息,就会包含mweb_url字段的参数,这个字段就是用来跳转到微信,进行支付的。那要怎么跳转呢,那就要拿到这个字段的字符串。

// 将xml字符串转成map
Map<String, String> map = WXPayUtil.xmlToMap(xmlStr);
String returnCode = map.get("return_code");
String returnMsg = map.get("return_msg");

String mweb_url = "";//跳转链接
if ("SUCCESS".equals(returnCode)) {
    mweb_url = map.get("mweb_url");
}
return mweb_url; // 返回前端跳转 或者 可以redirect重定向

前端JS直接跳转

window.location.href=mweb_url;

这样就拿到了mweb_url地址,然后重定向也好,返回前端跳转也好,就可以到微信付钱了,而付完钱之后,如果还想回到你指定的页面,还可以在mweb_url后面拼接上你想跳转页面的链接地址。
注意:地址必须是外网可以访问的地址,而且域名要跟公众号申请H5支付时提交的域名一致,还有地址需要进行urlencode处理

// 支付完返回浏览器跳转的地址,如跳到查看订单页面
String redirect_url = "http://www.xxxxxx.com/h5pay/placeAnOrder";
String redirect_urlEncode =  URLEncoder.encode(redirect_url,"utf-8");//对上面地址urlencode
mweb_url = mweb_url + "&redirect_url=" + redirect_urlEncode;//拼接返回地址

搞定。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 uni.app 使用微信公众号 H5 支付,你可以按照以下步骤进行操作: 1. 首先,确保你已经配置好了微信公众号支付功能,并且已经获取到了支付的相关参数,例如订单支付金额等。 2. 在 uni-app ,可以使用 `uni.request` 或其他网络求库来发起支付求。你需要向微信支付接口发送一个 POST 求,包含支付相关的参数。 例如: ```javascript uni.request({ url: 'https://api.mch.weixin.qq.com/pay/unifiedorder', // 微信支付接口地址 method: 'POST', data: { // 支付参数,例如 appid、mch_id、nonce_str、body、out_trade_no、total_fee 等 }, success: (res) => { // 求成功的回调函数 // 解析返回的数据,获取支付交易会话标识 prepay_id const prepayId = res.data.prepay_id; // 调用 H5 支付接口进行支付 uni.requestPayment({ provider: 'wxpay', timeStamp: '', // 时间戳 nonceStr: '', // 随机字符串 package: '', // 统一下单接口返回的 prepay_id 参数值 signType: 'MD5', paySign: '', // 签名 success: (res) => { // 支付成功的回调函数 console.log(res); }, fail: (err) => { // 支付失败的回调函数 console.log(err); } }); }, fail: (err) => { // 求失败的回调函数 console.log(err); } }); ``` 在上述代码,你需要根据实际情况填写支付接口地址、支付参数、支付交易会话标识 prepay_id 以及支付的回调函数。 3. 当用户点击支付按钮后,会触发支付求,用户将会跳转到微信支付页面完成支付操作。 注意,以上代码仅为示例,实际使用时需要根据 uni-app 的具体语法和微信支付接口的要求进行相应的调整和处理。同时,确保在后端服务器进行订单处理和验证,以确保支付的安全和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值