新版本 JSAPI微信支付V3 C# DEMO
小弟在公众号后台无意中点了更新(微信支付接口升级)PS:想都没有想,心里还乐滋滋的免费的干嘛不升级。。。后果来了。面临着支付不能用了,代码需要重新更新。
/**
* JS_API支付demo
* ====================================================
* 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。
* 成功调起支付需要三个步骤:
* 步骤1:网页授权获取用户openid (难点,因为这里有个大坑)
* 步骤2:使用统一支付接口,获取prepay_id(其实就是一个预支付id)
* 步骤3:使用jsapi调起支付
*/ 官方demo下载地址(暂只有PHP)https://mp.weixin.qq.com/paymch/readtemplate?t=mp/business/course3_tmpl&lang=zh_CN%816%A49 源代码下载: http://pan.baidu.com/s/1qWkb7B2
温馨提示:
1、支付授权目录一定要先配置好
2、测试白名单
3、一定要在当前公众号里面发起支付
步骤一:网页授权获取用户openid (难点,因为这里有个大坑)
官方文档:https://res.wx.qq.com/paymchres/zh_CN/htmledition/download/bussiness-course2/wxm-payment-oauth1eec8d.pdf
1)获取 code 2)通过 code 换取网页授权 accesstoken, 此 access_token 与基础支持的access_token 不同。 3)通过 accesstoken 换取用户基本信息
注意:这里必须要配置授权目录(就是这个坑。。。)
如图:
步骤二:获取prepay_id、配置支付的json参数
主要核心代码如下:
//设置package订单参数
SortedDictionary<string, string> dic = new SortedDictionary<string, string>(); string total_fee = (Charge_Amt * ).ToString("f0");
string wx_timeStamp = "";
string wx_nonceStr = Interface_WxPay.getNoncestr(); dic.Add("appid", Interface_WxPay.APPID);
dic.Add("mch_id", Interface_WxPay.PARTNER);//财付通帐号商家
dic.Add("device_info", "");//可为空
dic.Add("nonce_str", wx_nonceStr);
dic.Add("trade_type", "JSAPI");
dic.Add("attach", "att1");
dic.Add("openid", openid);
dic.Add("out_trade_no", Bill_No); //商家订单号
dic.Add("total_fee", total_fee); //商品金额,以分为单位(money * 100).ToString()
dic.Add("notify_url", TENPAY_NOTIFY.ToLower());//接收财付通通知的URL
dic.Add("body", Body);//商品描述
dic.Add("spbill_create_ip", Context.Request.UserHostAddress); //用户的公网ip,不是商户服务器IP string get_sign = BuildRequest(dic, PARTNER_KEY); string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
string _req_data = "<xml>";
_req_data += "<appid>" + Interface_WxPay.APPID + "</appid>";
_req_data += "<attach><![CDATA[att1]]></attach>";
_req_data += "<body><![CDATA[" + Body + "]]></body> ";
_req_data += "<device_info><![CDATA[1000]]></device_info> ";
_req_data += "<mch_id><![CDATA[" + Interface_WxPay.PARTNER + "]]></mch_id> ";
_req_data += "<openid><![CDATA[" + openid + "]]></openid> ";
_req_data += "<nonce_str><![CDATA[" + wx_nonceStr + "]]></nonce_str> ";
_req_data += "<notify_url><![CDATA[" + TENPAY_NOTIFY.ToLower() + "]]></notify_url> ";
_req_data += "<out_trade_no><![CDATA[" + Bill_No + "]]></out_trade_no> ";
_req_data += "<spbill_create_ip><![CDATA[" + Context.Request.UserHostAddress + "]]></spbill_create_ip> ";
_req_data += "<total_fee><![CDATA[" + total_fee + "]]></total_fee> ";
_req_data += "<trade_type><![CDATA[JSAPI]]></trade_type> ";
_req_data += "<sign><![CDATA[" + get_sign + "]]></sign> ";
_req_data += "</xml>";
//这里的方法只是一个htmlhelper(可以改为自己的)
ReturnValue retValue = StreamReaderUtils.StreamReader(url, Encoding.UTF8.GetBytes(_req_data), System.Text.Encoding.UTF8, true); //设置支付参数
XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(retValue.Message); XmlNode Event = xmldoc.SelectSingleNode("/xml/prepay_id"); string return_json = ""; if (Event != null)
{
string _prepay_id = Event.InnerText; SortedDictionary<string, string> pay_dic = new SortedDictionary<string, string>(); wx_timeStamp = Interface_WxPay.getTimestamp();
wx_nonceStr = Interface_WxPay.getNoncestr(); string _package = "prepay_id=" + _prepay_id; pay_dic.Add("appId", Interface_WxPay.APPID);
pay_dic.Add("timeStamp", wx_timeStamp);
pay_dic.Add("nonceStr", wx_nonceStr);
pay_dic.Add("package", _package);
pay_dic.Add("signType", "MD5"); string get_PaySign = BuildRequest(pay_dic, PARTNER_KEY); return_json = JsonUtils.SerializeToJson(new
{
appId = Interface_Weixin.strAPPID,
timeStamp = wx_timeStamp,
nonceStr = wx_nonceStr,
package = _package,
paySign = get_PaySign,
signType = "MD5"
});
} return return_json;
步骤三:JSAPI网页支付(demo有代码、不再累赘)
步骤四:支付回调(花费了一点时间才成功)
代码如下:
string wxNotifyXml = ""; byte[] bytes = Request.BinaryRead(Request.ContentLength);
wxNotifyXml = System.Text.Encoding.UTF8.GetString(bytes); if (wxNotifyXml.Length == )
{
return;
} XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(wxNotifyXml); string ResultCode = xmldoc.SelectSingleNode("/xml/result_code").InnerText;
string ReturnCode = xmldoc.SelectSingleNode("/xml/return_code").InnerText; if (ReturnCode == "SUCCESS" && ResultCode == "SUCCESS")
{
//验证成功
//取结果参数做业务处理
string out_trade_no = xmldoc.SelectSingleNode("/xml/out_trade_no").InnerText;
//财付通订单号
string trade_no = xmldoc.SelectSingleNode("/xml/transaction_id").InnerText;
//金额,以分为单位
string total_fee = xmldoc.SelectSingleNode("/xml/total_fee").InnerText; /********************************
*
* 自己业务处理
*
*********************************/
}
今天上班最后一天了,也是情人节。祝大家情人节快乐。。。。此处应有掌声
文采不够好,请谅解!
DEMO下载: http://pan.baidu.com/s/1qWkb7B2
新版本 JSAPI微信支付V3 C# DEMO的更多相关文章
- jsapi微信支付v3版
请看清楚你的微信支付是v2还是v3.在这里整理的是v3的,v2的同学请忽略! 前期准备须要用的是商户证书,用的是p12的.设置api密钥(在微信商户端中设置),还须要在微信公众号中设置jsapi授权文 ...
- 到处都是坑的微信支付V3
业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑…… 网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者, ...
- 微信支付 V3 开发教程(一):初识 Senparc.Weixin.TenPayV3
前言 我在 9 年前发布了 Senparc.Weixin SDK 第一个开源版本,一直维护至今,如今 Stras 已经破 7K,这一路上得到了 .NET 社区的积极响应和支持,也受到了非常多的宝贵建议 ...
- 坑爹的微信支付v3,其实没有那么坑
http://www.cnblogs.com/zskbll/p/wxpay.html 研究微信开发一年多了,每个新接口,都会第一时间进行研究.微信支付开放很久,一直没机会接触到支付接口,等了好久终于从 ...
- 到处都是坑的微信支付V3之 微信支付回调页面
据上次 到处都是坑的微信支付V3 后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程. 1. html中根据前台支付后反馈信息成功 ...
- 微信支付[v3]
原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白 ...
- jsapi微信支付
JSAPI微信支付 引用js <script type="text/javascript" src="http://res.wx.qq.com/open/js/jw ...
- 微信支付v3开发(5) 扫码并输入金额支付
关键字:微信支付 微信支付v3 动态native支付 统一支付 Native支付 prepay_id 作者:方倍工作室 本文介绍微信支付下的扫描二维码并输入自定义金额的支付的开发过程. 注意 微信支付 ...
- 为了Java微信支付V3开发包,我找出了微信支付文档至少六个错误
1. 前言 最近忙的一批,难得今天有喘气的机会就赶紧把最近在开发中的一些成果分享出来.前几日分享了自己写的一个微信支付V3的开发包payment-spring-boot-starter,就忙里偷闲完善 ...
随机推荐
- 如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?(2)
[编者按]本篇文章作者是 Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客.本篇文章中,作者主要介绍了如何基于 Parse 特点,打造一款类似 Instagr ...
- (一)初探HTML!
想自己动手做一个个人网站,因此,最近在自学PHP,主要看韩顺平老师的教学视频..将自己学习的点点滴滴记录在博客园,希望数月之后,自己可以熟练的运用PHP,也希望各位PHP高手们给予指点,不胜感激!! ...
- 使用ADO连接oracle数据库“未找到提供程序。该程序可能未正确安装”解决方案
问题描述:VS2010开发的C++程序,在一台Win7旗舰版的已安装Oracle客户端的PC上连接不上Oracle,提示“未找到提供程序.该程序可能未正确安装”,其他语言编写的程序比如C#是可以成功连 ...
- Project Euler 104:Pandigital Fibonacci ends 两端为全数字的斐波那契数
Pandigital Fibonacci ends The Fibonacci sequence is defined by the recurrence relation: F[n] = F[n-1 ...
- Linux中查看进程的多线程
在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况: 在我的系统中,用qemu-syst ...
- Java-马士兵设计模式学习笔记-责任链模式-处理数据
一.目标 数据提交前做各种处理 二.代码 1.MsgProcessor.java public class MsgProcessor { private List<Filter> filt ...
- 为什么要关闭360云盘:新来的美工嫌我们logo太丑,所以就决定关闭了。这个理由怎么样
新来的美工嫌我们logo太丑,所以就决定关闭了.这个理由怎么样曾经拥有的不要忘记:不能得到的更要珍惜:属于自己的不要放弃:已经失去的留作回忆.我刚来~~~嘿嘿~~ 久经考验的,忠诚的国际宅男主义战士, ...
- Mysql Workbench 学习
1.安装 http://dev.mysql.com/downloads/tools/workbench/ 选择合适的,下载(以Ubuntu 为例) cd到下载目录,然后sudo dpkg -i wor ...
- 312. Burst Balloons
题目: Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented ...
- 忘记导入struts2-xxx-plugin-x.x.x.jar导致服务器启动报Unable to load configuration.Caused by: Parent package is not defined: xxx-default
今天做的一个Struts2+MyFaces(JSF)+Spring的应用,为了使用JSF,我的struts.xml中使用了如下代码 <package name="jsf" e ...