.NET微信支付(H5仅限公众号支付)
闲来无事,恰好有一个要用微信公众平台支付的功能,研究来研究去,就是要细心和多看腾讯提供的文档。当然有几个坑是很有必要说明一下的
公众号支付,这里统一叫H5支付,以下都是。
在做H5支付的时候,第一步就是要微信授权,获取您的Openid,具体为啥请看腾讯详细文档说明:
文档详细地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。openid如何获取,可参考【获取openid】。
企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换。
获取授权信息也是比较简单的 http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 这是腾讯详细的授权文档说明
授权code
public class WxData { public static string APPID = "wxe32";//微信公众号ID public static string APPscriete = "250d56c";//微信密钥 public static string rediret_url = "http://XXXXX/Pay/Pay.aspx";//回调地址 //public static string rediret_url = "http://XXXXX/getcode.aspx";//回调地址 public static string snsapi_base = "snsapi_base";//默认类型 public static string notify_url = "http://XXXX";//回调URL,通知支付结果 public static string MCHID = "132186sssss8801";//商户号 public static string IP = "8.8.8.8";//终端IP public static string KEY = "ssssssssss";//商户支付密码 }
a、第一次调取链接获取code
string snsapi_base_url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect", Common.WxData.APPID, HttpUtility.UrlEncode(Common.WxData.rediret_url), Common.WxData.snsapi_base);
b、第二次调取链接获取Openid
public class WxUserInfor { public string access_token { get; set; } public string expires_in { get; set; } public string refresh_token { get; set; } public string openid { get; set; } public string scope { get; set; } }
if (!string.IsNullOrEmpty(Request["code"])) {string Acess_token_url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Common.WxData.APPID, Common.WxData.APPscriete, Request["code"]); string Result = httpactions.HTTP_GET(Acess_token_url, ""); if (!string.IsNullOrEmpty(Result)) { wxUser = httpactions.GetAccessToken(Result);//解析返回JSON字符
} }
以上是获取Openid才能进行支付,https://api.mch.weixin.qq.com/pay/unifiedorder 支付API,以POST方式进行提交参数
这里面有几个小细节需要注意
<xml> <appid>wx2421b1c4370ec43b</appid> <attach>支付测试</attach> <body>JSAPI支付测试</body> <mch_id></mch_id> <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str> <notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url> <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid> <out_trade_no></out_trade_no> <spbill_create_ip>14.23.150.211</spbill_create_ip> <total_fee></total_fee> <trade_type>JSAPI</trade_type> <sign>0CB01533B8C1EF103065174F50BCA001</sign> </xml>
1、传参total_fee金额的问题,我想如果没有仔细看文档的话,你就不知道咋传值,腾讯提供的金额精确到分的,所有也就没有小数点一说
像3.5元,也就是3.5*10*10这样的写法
2、sign这个是签名,腾讯自带的demo和相关文档里面都有详细的描述https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3签名
算法(JSAPI)页面里面返回的Paysign签名也是一样就是传的参数不一样
3、还有就是随机字符串之内的写法要注意
提供一下签名的C#写法(腾讯DEMO)
SortedDictionary<string, object> m_values = new SortedDictionary<string, object>(); m_values.Add("); m_values.Add("); m_values.Add("); m_values.Add( * ); m_values.Add("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); m_values.Add().ToString("yyyyMMddHHmmss")); m_values.Add("trade_type", "JSAPI"); m_values.Add("); m_values.Add("notify_url", Common.WxData.notify_url); m_values.Add("appid", Common.WxData.APPID); m_values.Add("mch_id", Common.WxData.MCHID); m_values.Add("spbill_create_ip", Common.WxData.IP); m_values.Add("nonce_str", GenerateNonceStr); string buff = ""; foreach (KeyValuePair<string, object> pair in m_values) { if (pair.Value == null) { return; } if (pair.Key != "sign" && pair.Value.ToString() != "") { buff += pair.Key + "=" + pair.Value + "&"; } } buff = buff.Trim('&'); string str = buff; //在string后加入API KEY str += "&key=" + Common.WxData.KEY; MD5s.CreateDyr(System.Web.HttpContext.Current.Server.MapPath(Logs), str + "///支付组合签名 \r\n\r\n"); //MD5加密 var md5 = MD5.Create(); var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(str)); var sb = new StringBuilder(); foreach (byte b in bs) { sb.Append(b.ToString("x2")); }
然后就是页面的调用JS--仅仅只能在微信里面调用改JS,JsApiParameters就是一串JSON值
<script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <%=JsApiParameters%>,//josn串 function (res) { WeixinJSBridge.log(res.err_msg); alert(res.err_code + res.err_desc + res.err_msg); } ); } function callpay() { if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } } else { jsApiCall(); } } </script> </head> <body> <form id="form1" runat="server"> <div class="orderNum"> <span>订单号</span> <label><%=OrderID %></label> </div> <div class="payMoney"> <span>应付金额</span> <label>¥<%=Moneyss %></label> </div> <div class="payCont"> <a href="javascript:;" onclick="callpay()"><span></span>微信支付</a> </div> <body>
.NET微信支付(H5仅限公众号支付)的更多相关文章
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...
- C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...
- 【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...
- 微信支付接口开发之---微信支付之JSSDK(公众号支付)步骤
1.准备 1.1.公众号为服务号,开通微信支付功能 1.2.为了方便调试微信后台的回调URL(必须为外网),我用了nat123软件来做一个映射 1.3.官方微信开发的示例WxP ...
- 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...
- C#版微信公众号支付|微信H5支付|微信扫码支付问题汇总及解决方案总结
最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存.代码在文章结尾处,有需要的 ...
- 第三方微信支付,WAP、H5、APP、公众号支付的区别
你说一个微信支付被腾讯搞了N个版本出来,是技术问题还收费原因不得而知.公众号支付,H5(wap)支付,APP支付.看得小编一头雾水. 带点N个疑问? 1.公众号支付是在公众号里支付,支众号里引入的三方 ...
- 微信公众号支付流程(Node实现)
前言 花费了一天时间,调通了微信公众号支付.作下记录,方便以后再次填坑.先声明,微信公众号支付,不同于微信H5支付,这点在本文结束时再详细说明. 微信配置 设置测试目录 在微信公众平台设置,栏目见下图 ...
- JAVA开发微信支付-公众号支付/微信浏览器支付(JSAPI)
写这篇文章的目的有2个,一是自己的项目刚开发完微信支付功能,趁热回个炉温习一下,二也是帮助像我这样对微信支付不熟悉,反复看了多天文档还是一知半解,原理都没摸清,更不要说实现了.本以为网上的微信开发教程 ...
随机推荐
- VC的文件操作
各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的.本文将对Visua ...
- Thinkphp框架 -- 短信接口验证码
我用的是一款名叫 短信宝 的应用,新注册的用户可以免费3条测试短信,发现一个BUG,同个手机可以无限注册,自己玩玩还是可以的. 里面的短信接口代码什么信息都没有,感觉看得不是很明白,自己测试了一遍,可 ...
- php error file_get_contents()
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- StructureMap 学习笔记(1)
前言 一个偶然的机会接触到了StructureMap,当时客户要求让程序具有较好的测试性,自然而然就想到了IOC 容器. 之后就去Google了一下, 不经意间在StackOverFlow找到一篇帖子 ...
- 嗯,记录一些eclipse的快捷键
alt+/:自动补全 ctrl+/:注释 // 再按一下取消注释 ctrl+shift+\:区块注释 /* */ ctrl+shift+\:取消区块注释 ctrl+shift+f:格式化代码 ctrl ...
- ValueBar
https://github.com/PhilJay/ValueBar
- 在一个文件中有10G个整数,乱序排列,要求找出中位数
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...
- 【ZZ】Python入门神图
http://mp.weixin.qq.com/s?__biz=MzA3OTIxNTA0MA==&mid=401383338&idx=1&sn=73009cce06d58656 ...
- Spring 3.1 Environment Profiles--转载
原文地址:http://gordondickens.com/wordpress/2012/06/12/spring-3-1-environment-profiles/ Profiles Spring ...
- javascript——马步之Array篇
数组 Array == 1.建立数组==* 通过变量赋值为[]来建立数组 var arr = []; // arr 是一个数组 * 需要注意数组的下标是从0开始中的 ==2.获取数组长度== * 通过 ...