array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 新版本 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 换取用户基本信息

注意:这里必须要配置授权目录(就是这个坑。。。)
如图:

新版本 JSAPI微信支付V3 C# DEMO



步骤二:获取prepay_id、配置支付的json参数

主要核心代码如下:
 //设置package订单参数
            SortedDictionary<string, string> dic = new SortedDictionary<string, string>();

            string total_fee = (Charge_Amt * 100).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", "1000");//可为空
            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 == 0)
            {
                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;

                /********************************
                 * 
                 * 自己业务处理
                 * 
                *********************************/
            }
View Code

相关文章: