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

献上地址:

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

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