一直使用.net 作爲優先開發平臺,做APP當然使用了xamarin 了。
最頭痛的是ios 涉及的充值或APP功能上的必須使用inPay ,然後android 在國內使用不了inPay 只能使用支付寶和微信支付。
總算把支付寶了和ios的inPay搞掂,WeChat 申請商戶號、開發者平臺,各樣申請各樣認證,商戶號用了300,開發者認證用了300。本人覺得非常坑,同樣的認證類型內容也一樣,就是帳號不一樣,開發者平臺又不能用商戶的登錄帳號,需要使用新的。明坑錢,結構上亂七八的,微信商戶平臺、開發者平臺、公衆號平臺。 又沒有SSO(單點登錄),如果說我個人認爲的專業角度,真是爛,或者這樣才能多收點錢吧。然後開發者平臺的APPID和公衆號的APPID很容易讓初學者搞暈,商戶號又要綁定開發者平臺的APPID,開發者平臺APP又要審覈(7個工作日),然後申請支付,認證(也要1-2個工作日),認證後綁定,然後再在商戶平臺,打開支付權限,這裏APP再次審覈(1-3工作日)。這樣一來半個月沒了。
正所謂一個拳頭產品養全家,微信遍及性讓國內開發者必選,如果非必選我反喜歡支付寶了。
廢話說完了,說一下坑:
xamarin 綁定最新的sdk.已經編譯好DLL,jar的綁定庫非常簡單,網上搜一下就有。
附上下載:https://download.csdn.net/download/Jockey/12411683
APP微信支付需要用到“統一支付下單”,這個容易理解,就是不管APP,WEB,小程序,公衆號,都用到這個預支付訂單API。
C#引用一個官方的SDK,然後簡單修改一下APPID,商用ID,apiKey,和密鑰。然後調用簽名方法,post申請後順利產生訂單數據。
返回的數據,然後用到如下信息
public static string SecSign(string prepayid, string noncestr,string timestamp)
{
//二次簽名
Dictionary<string, string> parameters1 = new Dictionary<string, string>();
parameters1.Add("appid", AppId);//開發者平臺的APPID
parameters1.Add("partnerid", PartnerId);//商戶ID
parameters1.Add("prepayid", prepayid);//剛纔生成的預付訂單的ID
parameters1.Add("noncestr", noncestr);//剛纔請求預付訂單的隨機值(不能新產生的)
parameters1.Add("timestamp", timestamp);//時間截
parameters1.Add("package", "Sign=WXPay");
string content = GetSignContent(parameters1);
//,在stringA最後拼接上key得到stringSignTemp字符串,並對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換爲大寫,得到sign值signValue。
//stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key爲商戶平臺設置的密鑰key
string signResult =Xamarin.AppFramework.Helpers.CryptHelper.GetMD5(content + "&key=" + outkey).ToUpper();
return signResult;
}
注意這裏使用的是MD5簽名。
然後直接
bool torf = wxApi.SendReq(payReq);
這裏調用返回是 true
,然後在回調類中
public void OnResp(BaseResp resp)
{
int rel= resp.MyErrCode;//返回-1
}
查了網上大量資料,
1、appid 和商戶ID設置錯誤
2、APIKEY 設置錯誤
3、NonceStr要與申請預支付時一致
4、包名和簽名錯誤(開發者平臺可以查看和修改)
5、微信支付第一次簽名錯誤後緩存後,緩存未清一直使用錯誤的簽名。
我查了一下,原來我提交開發者平臺審覈時使用提發佈包,所以簽名錯誤了,改回來。重試。
還是-1,。。。。呢瑪。。。
難道舊緩存問題,好吧,先備份好聊天記錄。備份時睡覺了不管明天處理。。
把微信刪除了。
重裝微信後,重試。
還是返回-1
。。。。。。。反覆檢查各項會不會有錯誤,也調試節幾次,不見有什麼犯錯。
唉。。。還是看一下官方的文檔,從統一下單API,看到APP呼出API,終於看到了問題了,
官方還好心用紅色字。
查了一下,我預支付的簽名是用sha256的(引用微信官方的SDK)。然後支付調用代碼使用的是MD5,我靠。吐血。
因爲自己太懶了,就找網上的代碼修改後使用。怪自己大意。
改回用sha256做簽名,成功調用。
以上代碼參考:https://blog.csdn.net/qq_21121397/article/details/89308563
如果你請求預支付訂單時不是使用MD5的,一定要改回來。
要不是讓你查一整天。
微信後端不能人性化一點嗎?不要只返回一個-1,根據sha256和md5生成的簽名長度都不一樣,返回時不能提醒:請檢查預支付簽名與APP支付簽名類型是否一致。這是花了600元,還換不到一個人性化的提示。