創建沙箱測試賬號及引入支付寶相應語言的SDK,支付寶開放平台有詳細介紹,這里就不做贅述了。
主要代碼如下:
創建支付配置類
public class AlipayConfig { //APPID public static string appId = ""; //支付寶網關 public static string gateway = "https://openapi.alipaydev.com/gateway.do"; //用戶私鑰 public static string privateKey = ""; //支付寶公鑰 public static string alipayPublicKey = ""; //支付成功的回調地址 public static string returnURL = ""; // 簽名方式 public static string sign_type = "RSA2"; // 編碼格式 public static string charset = "UTF-8"; private static string generateOrderNumber() { return DateTime.Now.ToString("yyyyMMddHHmmssfff"); } /* * 創建支付model * price:商品價格 * title:商品標題 * description:商品描述 * **/ public static AlipayTradePagePayModel creatModel(string price, string title, string description) { AlipayTradePagePayModel model = new AlipayTradePagePayModel(); model.Body = description; model.Subject = title; //付款金額 model.TotalAmount = price; //商戶網站中唯一訂單號 model.OutTradeNo = generateOrderNumber(); model.ProductCode = "FAST_INSTANT_TRADE_PAY"; return model; } }
Controller層主要接口:
用戶點擊支付后的跳轉接口
public string Index() { DefaultAopClient client = new DefaultAopClient(AlipayConfig.gateway, AlipayConfig.appId, AlipayConfig.privateKey, "json", "1.0", AlipayConfig.sign_type, AlipayConfig.alipayPublicKey, AlipayConfig.charset, false); //金額格式必須是小數點后兩位數或是正整數且不是金額格式(即$123.00),以及非常重要的一個原則,傳遞的參數要么不傳遞這個參數(即傳遞的眾多參數中,這個參數完全不存在 AlipayTradePagePayModel model = AlipayConfig.creatModel("9.90","測試商品","測試商品支付"); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); //支付成功的回調地址 request.SetReturnUrl("xxxxxxxxxx"); // 設置異步通知接收地址,需要公網能夠訪問 request.SetNotifyUrl("xxxxxxxxxx"); // 將業務model載入到request request.SetBizModel(model); AlipayTradePagePayResponse response = null; try { response = client.pageExecute(request); return response.Body; } catch (Exception exp) { throw exp; } }
在此過程中支付寶會返回給我們一個表單數據,此表單不需要我們做任何操作,自動提交
同步回調地址為通知用戶付款操作后自定義的跳轉頁面,異步回調地址為支付寶通知后台用戶付款操作的結果;具體操作結果以異步通知結果為准。
異步回調接口:
public void notify() { Dictionary<string, string> sArray = GetRequestPost(); if(sArray.Count > 0){ //調用SDK驗簽方法 bool signVerified = AlipaySignature.RSACheckV1(sArray, AlipayConfig.alipayPublicKey, AlipayConfig.charset); //此判斷結果中書寫業務邏輯代碼 if (signVerified) //驗證支付發過來的消息,簽名是否正確 { //商戶訂單號 string out_trade_no = Request.Form["out_trade_no"]; //支付寶交易號 string trade_no = Request.Form["trade_no"]; //交易狀態 string trade_status = Request.Form["trade_status"]; if (Request.Form["trade_status"] == "TRADE_FINISHED") { //判斷該筆訂單是否在商戶網站中已經做過處理 //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序 //如果有做過處理,不執行商戶的業務程序 //注意: //退款日期超過可退款期限后(如三個月可退款),支付寶系統發送該交易狀態通知 } else if (Request.Form["trade_status"] == "TRADE_SUCCESS") { //判斷該筆訂單是否在商戶網站中已經做過處理 //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序 //如果有做過處理,不執行商戶的業務程序 //注意: //付款完成后,支付寶系統發送該交易狀態通知 //請在這里加上商戶的業務邏輯程序代碼 } else { } Response.Write("success"); //返回給支付寶消息,成功,這里不要動!!! } else { Response.Write("fail"); } } } public Dictionary<string, string> GetRequestPost() { int i = 0; Dictionary<string, string> sArray = new Dictionary<string, string>(); NameValueCollection coll; coll = Request.Form; String[] requestItem = coll.AllKeys; for (i = 0; i < requestItem.Length; i++) { sArray.Add(requestItem[i], Request.Form[requestItem[i]]); } return sArray; }
至此,支付接口調用完成。
支付寶對於接口調用 的文檔說明還是比較清晰詳細的,仔細去閱讀以下文檔,思路還是較為清晰的