微信APP支付 C#
微信APP支付服務(wù)端開發(fā)總結(jié)(走過的坑,一定要留下痕跡)
更多相關(guān)代碼在文章結(jié)尾
一、配置文件,將appid、mch_id、 key、notify_url、trade_type寫在配置文件中或者寫在一個(gè)專門的類中
二、解析微信服務(wù)端返回的數(shù)據(jù)建議用XDocument?
三、API調(diào)用
1、統(tǒng)一下單接口處理,這個(gè)接口中主要獲得prepay_id,并傳給客戶端,這個(gè)接口中有兩次簽名,可以封裝下
其中需要注意的地方?total_fee 的單位是分,也就是沒有小數(shù),否則會(huì)返回invalid?total_fee ?.(這個(gè)可以服務(wù)端處理也可以客戶端處理,將傳過來的參數(shù)值變換成單位為分的數(shù)額即可)
還有要注意的是簽名的Key需要按ASCII碼值從小到大排序,這個(gè)最好寫一個(gè)統(tǒng)一的方法生成xml.
2、回調(diào)函數(shù),一般微信均會(huì)成功回調(diào),我做的項(xiàng)目中因?yàn)?strong>有攔截,所以沒有調(diào)取成功,因此在app回調(diào)時(shí)一直返回簽名錯(cuò)誤,調(diào)試發(fā)現(xiàn)transaction_id為空也就是在回調(diào)到時(shí)候沒有返回。
這個(gè)接口中主要實(shí)現(xiàn)支付成功后的邏輯,要保證安全性,所以要做簽名驗(yàn)證、和查詢訂單來確保程序正常執(zhí)行了。
3、APP回調(diào)接口,主要是支付成功后,app調(diào)取這個(gè)接口進(jìn)行主動(dòng)查詢,看是否真的成功,這個(gè)接口中需要注意的就是邏輯的處理了,如果查詢訂單成功,并且財(cái)務(wù)表查詢已經(jīng)支付,那就返回客戶端支付成功;若是查詢訂單是成功的但是財(cái)務(wù)表查到的是沒有支付,那么就要進(jìn)行相應(yīng)的邏輯處理,或者讓客戶聯(lián)系客服。建議進(jìn)行與回調(diào)函數(shù)中相同的處理。
4、支付的整個(gè)代碼中一定要及時(shí)的記錄相應(yīng)的日志,以便于查找相應(yīng)的錯(cuò)誤。
四、相關(guān)代碼
private static SortedDictionaryCreateWapAndAppPayParam(string noncestr, string transaction_id){SortedDictionarydic = new SortedDictionary();dic.Add("appid", WePayConfig.IOS_CZ_Appid);//公眾賬號(hào)IDdic.Add("mch_id", WePayConfig.Mch_id);//商戶號(hào)dic.Add("nonce_str", noncestr);//隨機(jī)字符串transaction_iddic.Add("transaction_id", transaction_id);return dic;}public static string GetUrlParam(SortedDictionarydic) { StringBuilder sb = new StringBuilder(); foreach (KeyValuePairitem in dic.OrderBy(o => o.Key)) { sb.Append(item.Key + "=" + item.Value + "&"); } return sb.ToString();//最后一個(gè)帶有& } public static string Sign(string prestr, string _input_charset) { StringBuilder sb = new StringBuilder(32); MD5 md5 = new MD5CryptoServiceProvider(); byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(prestr)); for (int i = 0; i < t.Length; i++) { sb.Append(t[i].ToString("x").PadLeft(2, '0')); } return sb.ToString(); } public static string BuildForm(SortedDictionarydicParam) { StringBuilder sbXML = new StringBuilder(); sbXML.Append(""); foreach (KeyValuePairtemp in dicParam) { sbXML.Append("<" + temp.Key + ">" + temp.Value + ""); } sbXML.Append(""); return sbXML.ToString(); } SortedDictionarystrDic = CreateWapAndAppPayParam(nonce_str, transaction_id); string str = WePayConfig.GetUrlParam(strDic); str += "key=" + key; string sign = WePayConfig.Sign(str, "utf-8").ToUpper(); strDic.Add("sign", sign); string postXML = WePayConfig.BuildForm(strDic);
public static string CreateXML(string key, params string[] strs){string stringA = "";StringBuilder sb = new StringBuilder("");foreach (string item in strs){stringA += item + "&";sb.Append("<" + item.Split('=')[0].Trim() + ">");sb.Append(item.Split('=')[1]);sb.Append("");}stringA += "key=" + key;//stringA.Replace("packageValue", "Sign=WXPay");string sign = WePayConfig.Sign(stringA, "utf-8").ToUpper();// System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(stringA, "MD5").ToUpper();sb.Append("");sb.Append(sign);sb.Append("");sb.Append("");return sb.ToString();}
總結(jié)
以上是生活随笔為你收集整理的微信APP支付 C#的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: osg指定向量旋转指定角度
- 下一篇: C#面试题整理(不带答案)