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
献上地址: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”, “” + 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 = “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[wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=*******71655&package=1******9]]></mweb_url>
</xml>

提取到   mweb_url,绑定到href上即可。
<a href=”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直接打开,会提示错误。
微信官方文档地址:pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持华域联盟。

您可能感兴趣的文章:ASP.NET Core 2.0 使用支付宝PC网站支付实现代码ASP.NET Core 2.0 支付宝扫码支付的实现代码最详细的ASP.NET微信JS-SDK支付代码asp.net B2B网站对接支付宝接口asp.net 支付宝及时到帐接口使用详解支付宝 接口开发帮助(asp,php,asp.net,jsp)

ASP.NET
MVC
微信支付

相关文章
asp.net 从客户端中检测到有潜在危险的 Request.Form 值错误解asp.net程序运行时出现以下错误: “/news”应用程序中的服务器错误。 2009-05-05
asp.net 脏字典过滤问题 用正则表达式来过滤脏数据asp.net 脏字典过滤问题 用正则表达式来过滤脏数据 2009-10-10
Asp.net 5种页面转向方法页面转向也是有技巧的,下面的是asp.net下的几种转向方法。 2009-02-02
sql server中批量插入与更新两种解决方案分享(asp.net)xml和表值函数的相对复杂些这里简单贴一下bcp和SqlDataAdapter进行批量跟新插入方法,未经整理还望见谅 2012-05-05
ASP.NET中内嵌页面代码的一个问题如果页面继承了一个父页面,而且当前页面用new覆盖了父页面的某个属性 2010-02-02
Asp.Net套用母版页后元素ID不一致(个人总结)这篇文章主要介绍了Asp.Net套用母版页后元素ID不一致(个人总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2018-11-11
asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式这两天正在研究报表中饼图的绘图方法,文章中的某些做法值得参考. 2008-08-08
IIS7的应用程序池详细解析在 IIS 7 中,应用程序池有两种运行模式:集成模式和经典模式。应用程序池模式会影响服务器处理托管代码请求的方式 2013-11-11
asp.net分页控件AspNetPager的样式美化自从吴旗娃推出了AspNetPager分页控件之后,受到了广大程序员朋友的喜爱,无数个网站都出现这个控件的身影。可是大部分网站程序员的朋友都是直接套用,导致满世界的分页控件样式都是一样的简洁,伤不起啊 2011-12-12
asp.net 过滤图片标签的正则asp.net 图片过滤正则实现代码。 2009-07-07

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。