程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 微信支付 v 3.3.6,支付3.3.6

微信支付 v 3.3.6,支付3.3.6

編輯:C#入門知識

微信支付 v 3.3.6,支付3.3.6


文字說明;

前提:注冊、申請服務號,開通微信支付。

涉及到的參數:AppId、AppSecret、原始ID(自動回復)、mch_id(商戶號)、Key(商戶密鑰:自己設定。)

統一規范:

  • 要求
  • 統一加密方式:MD5。
  • 統一簽名生成方式:
    •   傳入參數按字段名ascii碼從小到大排序,使用url鍵值對的格式(key1=value1&key2=value2...)拼接成字符串注:值為空的參數不參與簽名)。在字符串最後再拼接上&key=Key(商戶密鑰),然後進行MD5加密處理,最後得到的字符串轉換為大寫

微信支付:

  • jsapi支付和native支付都需要調用統一支付接口(URL 地址:https://api.mch.weixin.qq.com/pay/unifiedorder)
  • jsapi支付
    • jsapi 調用統一支付接口需要參數openid(通過Oath2.0授權獲取)。
    • 統一支付接口返回參數需要先驗證簽名,然後獲取prepay_id。
    • document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
      
        //公眾號支付
        jQuery('#wxPay').click(function(e){
      
          WeixinJSBridge.invoke('getBrandWCPayRequest',{
          "appId" : appId, //公眾號名稱,由商戶傳入
          "timeStamp" : timeStamp,   //時間戳
          "nonceStr" : nonceStr,        //隨機串
          "package" : package,     //格式:prepay_id=xxxx
          "signType" : signType,    //簽名方式:MD5
          "paySign" : paySign      //簽名:生成簽名參數appId、timeStamp、nonceStr、package、signType、key 注意參數名大小寫。
          },function(res){
            if(res.err_msg == "get_brand_wcpay_request:ok" ) {
              window.location.href=url;   //支付成功後跳轉到的頁面用於展示
            }
            // else {
              // alert(res.err_code+res.err_desc+res.err_msg);
            // }
          }); 
      
        });
      
      }, false) 
    • 注:jsapi頁面點擊了兩次“微信支付”,生成了兩筆訂單,需要在頁面微信支付按鈕上增加防二次點擊的機制。
  • native支付
    • 參數product_id必須的
    • 調用統一支付接口獲取code_url,並生成二維碼圖片。

微信支付回調notify_url:

    獲取xml格式參數,驗證簽名,處理邏輯(通知後台會多次回調,先檢查是否處理過,在執行)。

 

代碼區:

  • 生成Sign公共方法:
  • public string CreateSign(Dictionary<string, string> collection)
    {
      //排序
      List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>(collection);
      list.Sort(delegate(KeyValuePair<string, string> pair1, KeyValuePair<string, string> pair2)
      {
        return pair1.Key.CompareTo(pair2.Key);
      });
    
    
      StringBuilder sb = new StringBuilder();
      foreach (KeyValuePair<string, string> pair in list)
      {
        sb.Append(pair.Key);
        sb.Append("=");
        sb.Append(pair.Value);
        sb.Append("&");
      }
      string str = sb.Append("key=value").ToString();
      string signValue = MD5(str).ToUpper(); //md5加密並轉換成大寫
      return signValue ;
    }
  • xml 和 Dictionary 轉換方法:
  • public string DictionaryToXml(Dictionary<string, string> collection)
    {
      StringBuilder sb = new StringBuilder();
      sb.Append("<xml>");
      foreach (KeyValuePair<string, string> pair in collection)
      {
        sb.Append("<" + pair.Key + ">");
        sb.Append("<![CDATA[" + pair.Value + "]]>");
        sb.Append("</" + pair.Key + ">");
      }
      sb.Append("</xml>");
      return sb.ToString();
    }
    
    public Dictionary<string, string> XmlToDictionary(XmlDocument doc)
    {
      Dictionary<string, string> collection = new Dictionary<string, string>();
      foreach (XmlElement element in doc.DocumentElement.ChildNodes)
      {
        string key = element.Name;
        string value = element.InnerText;
        if (value != "")
        {
          collection.Add(key, value);
        }
      }
      return collection;
    }
  • 獲取Json某一key值:
  • public string GetJosnValue(string jsonStr, string key)
    {
      string result = string.Empty;
      if (!string.IsNullOrEmpty(jsonStr))
      {
        key = "\"" + key.Trim('"') + "\"";
        int index = jsonStr.IndexOf(key) + key.Length + 1;
        if (index > key.Length + 1)
        {
          //先截逗號,若是最後一個,截“}”號,取最小值
    
          int end = jsonStr.IndexOf(',', index);
          if (end == -1)
          {
            end = jsonStr.IndexOf('}', index);
          }
          //index = json.IndexOf('"', index + key.Length + 1) + 1;
          result = jsonStr.Substring(index, end - index);
          //過濾引號或空格
          result = result.Trim(new char[] { '"', ' ', '\'' });
        }
      }
      return result;
    }

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved