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

 更新时间:2019年12月16日 10:02:12   作者:vanteking  
这篇文章主要介绍了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.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

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

相关文章

  • JAVA正则表达式 Pattern和Matcher

    JAVA正则表达式 Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。
    2009-04-04
  • .NET Core自定义项目模板的全过程

    .NET Core自定义项目模板的全过程

    这篇文章主要给大家介绍了关于.NET Core自定义项目模板的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • asp.net+js实现的ajax sugguest搜索提示效果

    asp.net+js实现的ajax sugguest搜索提示效果

    阿会楠根据网上一份原作者不详的代码进行了修改,以适合自己的项目并增加了多个功能。此次放出的代码为基本实现代码,也是最接近原来的代码,略去其他功能。版权归原作者所有。
    2009-04-04
  • WPF图形解锁控件ScreenUnLock使用详解

    WPF图形解锁控件ScreenUnLock使用详解

    这篇文章主要为大家详细介绍了WPF图形解锁控件ScreenUnLock的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • .NET 6实现滑动验证码的示例详解

    .NET 6实现滑动验证码的示例详解

    这篇文章主要为大家详细介绍了如何利用.NET 6实现滑动验证码,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2022-11-11
  • Repeater控件动态变更列(Header,Item和Foot)信息(重构cs)

    Repeater控件动态变更列(Header,Item和Foot)信息(重构cs)

    上一篇虽然它算不上是完全动态化,但它已经达到初期想要的效果,现另开一篇,不是重新另外写,而是想重构cs的代码,因为前一篇的代码虽然简单,但代码冗余过多,感兴趣的朋友可以参考下哈
    2013-03-03
  • asp.net fileupload 实现上传

    asp.net fileupload 实现上传

    在vs的视图模式下,添加上传组件,以及添加一个按钮button,随后在后置代码中加入如下信息
    2009-05-05
  • Asp.Net Core Web应用程序—探索

    Asp.Net Core Web应用程序—探索

    这篇文章主要介绍了Asp.Net Core Web应用程序—探索,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Asp.Net设计模式之单例模式详解

    Asp.Net设计模式之单例模式详解

    这篇文章主要为大家详细介绍了Asp.Net设计模式之单例模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • .NET使用StackTrace获取方法调用信息的代码演示

    .NET使用StackTrace获取方法调用信息的代码演示

    StackTrace, 位于 System.Diagnostics 命名空间下,名字很直观,它代表一个方法调用的跟踪堆栈,里面存放着按顺序排列的栈帧对象(StackFrame),每当发生一次调用,就会压入一个栈帧,这篇文章主要介绍了.NET使用StackTrace获取方法调用信息,需要的朋友可以参考下
    2022-09-09

最新评论