微信支付之H5支付

news/2024/11/19 11:17:49/

先看下H5支付的官方描述吧:

H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。 
主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付。

上面的描述里写到一个很重要的点:微信客户端外的的移动端网页,接下来我们就针对这类支付,写下我的实现过程吧

【本文介绍普通商户的H5支付】

一、基本信息和配置

在基本配置的之初请参考【公众号支付】 的前面部分,
不同的是H5支付需要申请通过才能使用,申请的地方是商户平台 产品中心>我的产品,申请通过如下:
这里写图片描述

在开发配置里配上H5支付的域名
这里写图片描述

基本信息配置到此,下面开始敲代码

二、开发支付

建议参考微信H5开发文档
(https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1)

微信H5支付开发也是两步走:
1. 通过统一下单接口发起请求,获得mweb_url(支付跳转url),这个是你接下来进入微信提供的支付页面的地址;
2. 完成支付流程后,实现后续逻辑。

一)发起统一下单接口

此处请参考【微信支付之公众号支付】博客里的流程,这里有两个地方需要注意:
1)本次请求中的参数:交易类型(trade_type)的值是“MWEB”
2)本次返回结果需要得到的是“mweb_url”的值

参考方法(由于上一篇公众号支付写的比较详细,只列出上文没有细说的方法,值得注意的是这个UnifiedOrder对象里是没有openid这个字段,api说明里也提到过公众号支付必填openid,H5支付是不用填写的,主要是没有,O(∩_∩)O哈哈~)

 /*** * @Description: 微信支付 -统一订单类型获得mweb_url* @author tianpengw * @param uo* @return*/public static String getUnifiedOrderMWebUrl(UnifiedOrder uo){String sign = createUnifiedOrderSign(uo);uo.setSign(sign);String xml = XMLBeanUtils.objectToXMLStr(uo);log.info("H5支付统一订单请求参数:"+xml);String res = HttpHelper.httpsRequest(unifiedUrl,"POST",xml);log.info("H5支付统一订单返回结果:"+res);Map<String, String> responseMap = XMLBeanUtils.readStringXmlOut(res);return responseMap.get("mweb_url");}

相关的工具类不在赘述,参考上文公众号支付博客

通过此方法得到MWebUrl结果后,送到前端,通过window.location.href跳转即可完成H5支付流程,值得注意的是,H5支付扫尾比公众号支付要麻烦:

【官方文档】
一、回调页面正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面。如,您希望用户支付完成后跳转至https://www.wechatpay.com.cn,则可以做如下处理:假设您通过统一下单接口获到的MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096 则拼接后的地址为MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn注意:1.需对redirect_url进行urlencode处理2.由于设置redirect_url后,回跳指定页面的操作可能发生在:1,微信支付中间页调起微信收银台后超过5秒 2,用户点击“取消支付“或支付完成后点“完成”按钮。因此无法保证页面回跳时,支付流程已结束,所以商户设置的redirect_url地址不能自动执行查单操作,应让用户去点击按钮触发查单操作。回跳页面展示效果可参考下图

官方文档提到两个关键地方,第一点是用户可通过拼接redirect_url来指引微信处理后的跳转动向,这个地址需要urlencode处理,第二点是不管什么结果最终结束后微信都会调用这个redirect_url地址,我这里处理的方式是将重定向地址设置到订单提交页增加蒙层和对话框,让用户选择结果,然后在过程中查询订单结果然后根据结果跳转不同的页面

前端部分代码如下:

//对浏览器的UserAgent进行正则匹配,不含有微信独有标识的则为其他浏览器
var useragent = navigator.userAgent;
if (useragent.match(/MicroMessenger/i) == 'MicroMessenger') {//此处是公众号支付的逻辑不在列举
}else{$.ajax({type : "POST",url : "gotoJSPayH5.json",dataType : "json",contentType : 'application/json;charset=UTF-8',data : JSON.stringify({orderId:orderId}),success : function(res){if("success" == res.errCode){var url = res.data;window.location.href = url;}else{jQAlert("支付操作异常,请稍后再试!");}},error : function(XMLHttpRequest, textStatus,errorThrown) {jQAlert('支付异常,请联系客服!');},complete : function(XMLHttpRequest, textStatus) {}
});
}

最后贴出服务端方法:

/*** H5支付* @param req* @param ids* @param addrId* @param orderRemark* @return * @throws UnsupportedEncodingException */@RequestMapping(value = "gotoJSPayH5.json")@ResponseBodypublic Response gotoJSPayH5(HttpServletRequest req, @RequestBody PhoneBean pb) throws UnsupportedEncodingException{log.info("进入H5支付:" + pb.getOrderId());Response resp = new Response();if(!MyStringUtils.isEmpty(pb.getOrderId())){Order order = orderService.findOrderForPayH5(pb.getOrderId());if(null != order){Date endDate = MyDateUtil.parseDate(MyDateUtil.get30Minute(order.getOrderCreateTime()),MyDateUtil.DATETIME);if(MyConstants.order_need_pay == order.getOrderStatus() && new Date().before(endDate)){UnifiedOrder uo = new UnifiedOrder();uo.setSpbill_create_ip(HttpHelper.getClientIP(req));uo.setTrade_type(WechatPayUtil.tradeTypeH5);uo.setBody(MyConstants.project_title+"-商品支付");uo.setOut_trade_no(order.getOrderId());//测试环境if("test".equals(getDicValueByAlias("environment"))){uo.setTotal_fee(1);//测试使用单位分}else{uo.setTotal_fee(order.getOrderTotalPrice().multiply(new BigDecimal(100)).intValue());//单位分}String mwebUrl = WechatPayUtil.getUnifiedOrderMWebUrl(uo);if(!MyStringUtils.isEmpty(mwebUrl)){//增加支付记录WechatPay wp = new WechatPay();wp.setPayId(RandomUtils.g());wp.setPayOrderId(order.getOrderId());//测试环境if("test".equals(getDicValueByAlias("environment"))){wp.setPayAmount(new BigDecimal(0.01));//测试使用}else{wp.setPayAmount(order.getOrderTotalPrice());}wp.setPayReturnUrl(mwebUrl);wp.setPayType(WechatPayUtil.tradeTypeH5);wp.setPayStatus(MyConstants.pay_status_ing);wp.setPayNonceStr(uo.getNonce_str());wpService.insertWechatPay(wp);//拼接实现地址:跳转支付完成页面resp.setData(mwebUrl+ "&redirect_url=" +URLEncoder.encode(MyConstants.product_address + "/phone/payComplete.do?orderId=" + order.getOrderId() + "&tradeType=" + WechatPayUtil.tradeTypeH5,"utf-8"));resp.setErrCode(ErrorCode.err_code_success);}}else if(MyConstants.order_has_pay == order.getOrderStatus()){resp.setErrCode(ErrorCode.err_code_fail);resp.setErrMsg("订单已完成支付,请勿重复支付!");}else{resp.setErrCode(ErrorCode.err_code_fail);resp.setErrMsg("订单已失效,请重新选购商品!");}}}else{resp.setErrCode(ErrorCode.err_code_fail);resp.setErrMsg("订单无效,支付异常!");}return resp;}

这里有一些常用的方法就不再贴出了,简单描述下:
MyStringUtils:字符串处理工具类isEmpty() 非空判断方法;
MyDateUtil:日期解析工具类 parseDate()字符串转日期方法;

至此H5支付的主要流程就结束了,我的代码是两种支付的结合,有单独需求的可以分开,请继续关注【微信开发之自定义分享】,下文中我将把我自己总结jar包和源码都分享出来,供大家参考学习


http://www.ppmy.cn/news/161779.html

相关文章

微信H5支付概述

最近有项目接入微信H5支付&#xff0c;所以在这里大概总结下。 首先&#xff0c;需要微信公众号是服务认证号&#xff0c;然后申请开通微信H5支付【微信H5支付申请由原来的微信公众号平台迁移到商户平台&#xff0c;需要在商户平台申请开通】&#xff0c;开通后会收到邮件&…

web:H5和小程序的区别

web&#xff1a;H5和小程序的区别 H5和小程序的区别 H5和小程序不具备可比性&#xff0c;只是很多移动端的场景下&#xff0c;两种选择都能实现产品的大部分功能。最近几年&#xff0c;小程序的兴起&#xff0c;让人们理解他等同于H5&#xff0c;其实不然。 关于小程序与H5&…

微信公众号h5页面支付(MWEB)

/*** 官微-分期支付接口(h5页面支付)** param request* param response*/SuppressWarnings("unchecked")ResponseBodyRequestMapping(value "/wxWapPrePayH5", method RequestMethod.POST)public Map<String, Object> wxWapPrePayH5(HttpServletRe…

H5是什么?

自从从事于前端开发之后&#xff0c;总有朋友问我是做什么的&#xff0c;通俗的说&#xff0c;做H5的&#xff0c;然后闲时&#xff0c;坐车&#xff0c;吃饭&#xff0c;聚会&#xff0c;总会聊到工作&#xff0c;恩&#xff0c;h5&#xff0c;对方一脸懵逼的时候&#xff0c;…

H5微信公众号开发,微信支付

&#xff08;如需完整代码,开发遇到什么问题&#xff0c;可与本人联系&#xff0c;代码给大家下载并帮你解决问题&#xff0c;微信号&#xff1a;1131237188&#xff09; 1.公众号开发&#xff0c;首先需要微信公众号的appId,secret 相当于账号密码 2.到公众号后台配置域名&a…

H5的基础

网页的学名称作 HTML 文件&#xff0c;是一种可以在 www 网上传输&#xff0c;并被浏览器认识和翻译成页面显示出来的文件。 HTML是&#xff1a; Hypertext Marked Language 即超文本标记语言&#xff0c;是一种用来制作超文本文档的简单标记语言 超文本就是指页面内可以包含…

微信H5支付功能开发

本文介绍的是微信H5支付功能开发&#xff0c;也就是在微信之外的H5页面支付。 首先我们需要先看微信的官方文档https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter15_1&#xff0c;这里面几乎介绍了全部流程了。等你了解大概流程之后&#xff0c;需要在微信公众平台和微…

公众号H5微信生态

做个近期微信生态的总结 所有的前提是在微信公众平台 登录对应的微信公众号 公众号上配置对应的h5域名。 包括支付 分享等&#xff08;可自行百度 很多这种教程 官方文档也有搜索微信支付配置 里面有公众号配置等&#xff09; 首先是微信授权。主要拿用户的openId 进行支付操…