日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

微信APP支付 C#

發(fā)布時(shí)間:2023/12/20 C# 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信APP支付 C# 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微信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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。