我覺得玩微信支付最大的難點和瓶頸並不是微信支付本身,而是能夠拿到微信支付的權限.首先微信支付所面向的開發對象不是個人,所以個人開發者不會有這樣的權限,另外一方面公司的微信號又不會隨便給個人進行開發,這樣就陷入了一個比較尷尬的循環!
在好不容易搞到權限后,發現官方的sdk里面竟然有.NET版本,這讓小豬欣喜如狂,趕緊下下來研究一番.這也就有了本文.
在設置好開發環境,測試白名單,,回調…確定微信后台設置已經沒有問題之后.
接下來看.NET版本中的坑
默認Default.aspx中的鏈接竟然都是鏈接到http://paysdk.weixin.qq.com/example/ProductPage.aspx…這個不注意的真的會郁悶好久.將其改成我們自己的服務器測試地址.
默認他給你開啟了代理服務器,你不知道的話也會坑你好久
1
2
3
4
|
//=======【代理服務器設置】===================================
/* 默認IP和端口號分別為0.0.0.0和0,此時不開啟代理(如有需要才設置)
*/
public const string PROXY_URL = "http://10.152.18.220:8080";
|
如果這邊不填的話,又報錯,無效的 URI: 此 URI 為空。
如果填成0.0.0.0:0,報錯,無效的 URI: URI 方案無效。
心都碎了.只好找到他使用代理的地方手動注釋掉:
終於可以看到支付頁面了
我們不需要使用公用地址的功能,所以在后台注釋掉相關代碼
1
|
//獲取收貨地址js函數入口參數
|
把前台aspx頁面的使用地址的代碼也刪掉.
,可是點一下支付按鈕..
仔細一看,這里又特么跳轉到他們自己的測試服務器上面去啦.!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
protected void Button1_Click(object sender, EventArgs e)
{
string total_fee = "1";
if(ViewState["openid"] != null)
{
string openid = ViewState["openid"].ToString();
string url = "http://paysdk.weixin.qq.com/example/JsApiPayPage.aspx?openid=" + openid + "&total_fee=" + total_fee;
Response.Redirect(url);
}
else
{
Response.Write("頁面缺少參數,請返回重試" + "");
Button1.Visible = false;
Button2.Visible = false;
Label1.Visible = false;
Label2.Visible = false;
}
}
|
改成我們自己的服務器地址后又是下單失敗,只好找到代碼出錯的地方把try catch注釋掉看看哪出錯了!
發現還是無效的 URI: 尼瑪還有地方請求設置了代理,找到注釋掉:
這時候再打開終於見到可以看到預支付的界面了:
點擊支付按鈕也可以成功支付:
但是支付成功后卻不能正確的執行支付結果js回調函數.看看其頁面的點擊事件是放在asp:Button上面的.我們知道在asp.net webform中,按鈕的點擊是有頁面回調后台的.也就是其實點擊了之后頁面是有刷新的,所以這邊要是想用官方的js回調的話就不能使用asp.net的服務器控件了!將點擊支付的按鈕改成
1
|
<button style="width:210px; height:50px; border-radius: 15px; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button>
|
這樣,我們不管在支付成功和失敗后都會執行我們在界面里定義好的回調函數!
總結:不知道大TX的ASP.NET工程師是怎么想的,能夠打包成sdk供用戶參考必然是好的,但是卻挖了這么多坑在這,想必如果沒有一點基礎的話對付這玩意還真挺吃力的.
最后要感謝:smallerpig.
原文章地址:http://www.smallerpig.com/720.html