zoukankan      html  css  js  c++  java
  • 新版本 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 * 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

    今天上班最后一天了,也是情人节。祝大家情人节快乐。。。。此处应有掌声

    文采不够好,请谅解!

    DEMO下载: http://pan.baidu.com/s/1qWkb7B2

  • 相关阅读:
    Google glass GDK
    Google glass GDK
    Google glass GDK
    趣味开发
    Android
    Google glass GDK
    Google glass GDK
    Google glass GDK
    Android
    Google glass GDK
  • 原文地址:https://www.cnblogs.com/lxsweat/p/4290593.html
Copyright © 2011-2022 走看看