侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ASP.NET MVC 开发微信支付H5的实现示例(外置浏览器支付)

微信(小程序)  /  管理员 发布于 7年前   170

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.WxPayConfig wxConfig = new Com.Wxpay.WxPayConfig();          Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.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));          string data = packageReqHandler.ParseXML();          var urlFormat = "https://api.mch.weixin.qq.com/pay/unifiedorder";          var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);          MemoryStream ms = new MemoryStream();          ms.Write(formDataBytes, 0, formDataBytes.Length);          ms.Seek(0, SeekOrigin.Begin);          var result = RequestUtility.HttpPost(urlFormat, null, ms);          var res = System.Xml.Linq.XDocument.Parse(result);          string mweb_url = res.Element("xml").Element("mweb_url").Value;

然后我们会得到下面的Xml

<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx***********]]></appid> <mch_id><![CDATA[1*******]]></mch_id> <nonce_str><![CDATA[4rN3Sy63EsAErTq7]]></nonce_str> <sign><![CDATA[0E34B9B750778540436A5CDF005212CF]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201********************************]]></prepay_id> <trade_type><![CDATA[MWEB]]></trade_type> <mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=*******71655&package=1******9]]></mweb_url></xml>

提取到   mweb_url,绑定到href上即可。

<a href="https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=*******71655&package=1******9" rel="external nofollow" >立即支付</a>

支付成功之后,在回调地址里处理业务逻辑

    /// <summary>    /// 支付结果回调地址    /// </summary>    /// <returns></returns>    [HttpPost]    public virtual ActionResult PayNotifyUrl()    {           Com.Wxpay.WxPayConfig wxConfig = new Com.Wxpay.WxPayConfig();      Senparc.Weixin.MP.TenPayLibV3.ResponseHandler payNotifyRepHandler = new Senparc.Weixin.MP.TenPayLibV3.ResponseHandler(null);      payNotifyRepHandler.SetKey(wxConfig.key);      string return_code = payNotifyRepHandler.GetParameter("return_code");      string return_msg = payNotifyRepHandler.GetParameter("return_msg");      string xml = string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg);      if (return_code.ToUpper() != "SUCCESS")      {        return Content(xml, "text/xml");      }      string out_trade_no = payNotifyRepHandler.GetParameter("out_trade_no");      //微信服务器可能会多次推送到本接口,这里需要根据out_trade_no去查询订单是否处理,如果处理直接返回:return Content(xml, "text/xml"); 不跑下面代码      //验证请求是否从微信发过来(安全)      if (payNotifyRepHandler.IsTenpaySign())      {        //TO DO      }      else      {      }      return Content(xml, "text/xml");    }

注意:

不要使用此url直接打开,会提示错误。

微信官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    php初学者写及时补给skype用户充话费的小程序
    下一条:
    .Net微信网页开发解决用户在不同公众号或在公众号、移动应用之间帐号统一问题
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 微信模板消息改版后发送规则记录(微信订阅消息参数值内容限制说明)(1个评论)
    • 微信支付v3对接所需工具及命令(0个评论)
    • 2023年9月1日起:微信小程序必须备案才能上线运营(0个评论)
    • 腾讯官方客服回应了:微信好友上限约10000个!(1个评论)
    • 2023年做微信小程序的老铁注意:新增收费项、微信小程序获取手机号也收费了(2个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-10
    • 2018-01
    • 2020-03
    • 2021-06
    • 2021-10
    • 2022-03
    • 2023-02
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客