ASP.NET MVC 开发微信支付H5的实现示例(外置浏览器支付)
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。
主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付。
微信开放平台上的也只是简单的介绍了一下逻辑和常见问题,网上查看了很多,说的都不够具体
首先需要在微信商户平台里开通H5支付
申请入口:登录商户平台-->产品中心-->我的产品-->支付产品-->H5支付
代码逻辑:
1、用户在商户侧完成下单,使用微信支付进行支付
2、由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB
3、统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名“mweb_url”),商户通过mweb_url调起微信支付中间页
4、中间页进行H5权限的校验,安全性检查
5、如支付成功,商户后台会接收到微信侧的异步通知
6、用户在微信支付收银台完成支付或取消支付,返回商户页面(默认为返回支付发起页面)
7、商户在展示页面,引导用户主动发起支付结果的查询
8,9、商户后台判断是否接到收微信侧的支付结果通知,如没有,后台调用我们的订单查询接口确认订单状态
10、展示最终的订单支付结果给用户
我们需要用到的参数:
- AppID(应用ID)
- AppSecret(应用密钥)
- 微信支付商户号
- 微信商户支付密钥
我这里使用了第三方封装的SDK。谢谢开发者SDK的帮助。
Senparc.Weixin
献上地址:https://weixin.senparc.com/
H5支付其实就是生成一个链接,点击后会激活微信APP,弹出支付窗口
所以需要生成一个符合规则的Url,引入SDK
Com.Wxpay.WxPayConfigwxConfig=newCom.Wxpay.WxPayConfig(); Senparc.Weixin.MP.TenPayLibV3.RequestHandlerpackageReqHandler=newSenparc.Weixin.MP.TenPayLibV3.RequestHandler(null); packageReqHandler.SetParameter("appid",wxConfig.appid);//APPID packageReqHandler.SetParameter("mch_id",wxConfig.mchid);//商户号 packageReqHandler.SetParameter("nonce_str",Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr()); packageReqHandler.SetParameter("body","测试商品"); packageReqHandler.SetParameter("out_trade_no",model.OrderID);//订单号 packageReqHandler.SetParameter("total_fee",cost.ToString());//金额,以分为单位 packageReqHandler.SetParameter("spbill_create_ip",Request.UserHostAddress);//IP packageReqHandler.SetParameter("notify_url","http://"+HttpContext.Request.Url.Host+"/WxPay/PayNotifyUrl");//回调地址 packageReqHandler.SetParameter("trade_type","MWEB");//这个不可以改。固定为Mweb packageReqHandler.SetParameter("sign",packageReqHandler.CreateMd5Sign("key",wxConfig.key)); stringdata=packageReqHandler.ParseXML(); varurlFormat="https://api.mch.weixin.qq.com/pay/unifiedorder"; varformDataBytes=data==null?newbyte[0]:Encoding.UTF8.GetBytes(data); MemoryStreamms=newMemoryStream(); ms.Write(formDataBytes,0,formDataBytes.Length); ms.Seek(0,SeekOrigin.Begin); varresult=RequestUtility.HttpPost(urlFormat,null,ms); varres=System.Xml.Linq.XDocument.Parse(result); stringmweb_url=res.Element("xml").Element("mweb_url").Value;
然后我们会得到下面的Xml
提取到 mweb_url,绑定到href上即可。
支付成功之后,在回调地址里处理业务逻辑
//////支付结果回调地址 /// ///[HttpPost] publicvirtualActionResultPayNotifyUrl() { Com.Wxpay.WxPayConfigwxConfig=newCom.Wxpay.WxPayConfig(); Senparc.Weixin.MP.TenPayLibV3.ResponseHandlerpayNotifyRepHandler=newSenparc.Weixin.MP.TenPayLibV3.ResponseHandler(null); payNotifyRepHandler.SetKey(wxConfig.key); stringreturn_code=payNotifyRepHandler.GetParameter("return_code"); stringreturn_msg=payNotifyRepHandler.GetParameter("return_msg"); stringxml=string.Format(@" ",return_code,return_msg); if(return_code.ToUpper()!="SUCCESS") { returnContent(xml,"text/xml"); } stringout_trade_no=payNotifyRepHandler.GetParameter("out_trade_no"); //微信服务器可能会多次推送到本接口,这里需要根据out_trade_no去查询订单是否处理,如果处理直接返回:returnContent(xml,"text/xml");不跑下面代码 //验证请求是否从微信发过来(安全) if(payNotifyRepHandler.IsTenpaySign()) { //TODO } else { } returnContent(xml,"text/xml"); }
注意:
不要使用此url直接打开,会提示错误。
微信官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。