• 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">立即支付</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

  • 相关阅读:
    微信卡券领用中的问题
    abp的开发20180425
    typescript 接口的新认识
    Jquery构建Form表单Post提交数据的简单方法
    EF使用时异常:对一个或多个实体的验证失败。有关详细信息
    VS快捷键简单记录
    比较和排序 IComparable And IComparer
    wpf全局异常
    MailBee的简单使用
    json数据的获取(网络摘抄)
  • 原文地址:https://www.cnblogs.com/vanteking/p/7275369.html
Copyright © 2020-2023  润新知