ASP.NETMVC开发⽀付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
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", hid);//商户号
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", "" + 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 = "h.weixin.qq/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[wx.tenpay/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=*******71655&package=1******9]]></mweb_url>
</xml>
提取到 mweb_url,绑定到href上即可。
<a href="wx.tenpay/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直接打开,会提⽰错误。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
发布评论