支付寶掃碼支付方式,說簡單也簡單,只要是對接過支付寶接口的朋友,再做支付寶掃碼,可以說是非常的簡單,因為根本就沒有變多了,相對來說,反而更簡單了些,下面就讓我來詳細的給大家演示一下開發過程。
首先,當我們拿到開發包的時候,開發包下載:支付寶掃碼支付即時到賬開發包
請看下圖:
大概就這么多的文件,我們找到code_demo文件夾里面的alipay.mobile.qrcode.manage-CSHARP的demo,可以參考一下,然后開始做我們自己的開發。
一般來說,對接支付方式就是按照他們的要求格式將所需的數據推送給他們,然后他們會返回給商戶一些請求結果,商戶根據返回的結果做相應的邏輯處理。
支付寶二維碼開發的步驟也是如此,按照支付寶開發文檔上的步驟來,第一步就是商戶生成二維碼,商戶生成二維碼的過程需要我們根據支付寶提供的接口規則,構造要傳輸給支付寶的數據集合,然后通過頁面鏈接跳轉或表單提交的方式傳遞給支付寶;然后支付寶會對請求的數據進行處理,經過一系列驗證通過后便會處理完成這次發送過來的數據請求,對於處理完成的交易,支付寶會以某種形式的數據反饋給我們的網站程序。
首先是構造請求數據和處理支付寶返回數據:
protected void Page_Load(object sender, EventArgs e) { string orderNo = Request.QueryString["no"];//訂單號 if (string.IsNullOrEmpty(orderNo)) { Response.Write("訂單編號錯誤!"); return; } //取得要支付的金額 decimal totalPrice = decimal.Parse(Request.QueryString["Total"]); ////////////////////////////////////////////請求參數//////////////////////////////////////////// //接口調用時間 格式為:yyyy-MM-dd HH:mm:ss string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //動作 string method = "add"; //創建商品二維碼 //業務類型 string biz_type = "10"; //json數據 string biz_data = GetBizData(orderNo,totalPrice); //把請求參數打包成數組 SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>(); sParaTemp.Add("service", "alipay.mobile.qrcode.manage"); sParaTemp.Add("partner", Config.Partner); sParaTemp.Add("_input_charset", Config.Input_charset.ToLower()); sParaTemp.Add("timestamp", timestamp); sParaTemp.Add("method", method); sParaTemp.Add("biz_type", biz_type); sParaTemp.Add("biz_data", biz_data); string _sign = ""; foreach (var item in sParaTemp.OrderBy(s => s.Key)) { _sign = appendParam(_sign, item.Key, item.Value); } //簽名 string sign = AlipayMD5.Sign(_sign, Config.Key, Config.Input_charset.ToLower()); sParaTemp.Add("sign_type", Config.Sign_type); sParaTemp.Add("sign", sign); //建立請求 string sHtmlText = Submit.BuildRequest(sParaTemp); //請在這里加上商戶的業務邏輯程序代碼 XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.LoadXml(sHtmlText); XmlNode root = xmlDoc.DocumentElement;//返回的根節點 string is_success = root.SelectSingleNode("is_success").InnerText; if (is_success == "T") { string result_code = root.SelectSingleNode("/alipay/response/alipay/result_code").InnerText; if (result_code == "SUCCESS") { string qrcode = root.SelectSingleNode("/alipay/response/alipay/qrcode").InnerText;//二維碼地址 string qrcode_img_url = root.SelectSingleNode("/alipay/response/alipay/qrcode_img_url").InnerText;//二維碼圖片地址 //顯示二維碼 Response.Redirect("/CreateQRCode.aspx?URL=" + qrcode_img_url + "&orderno=" + orderNo + "&cashm=" + totalPrice); } else { Response.Write("業務處理失敗!"); } } else { Response.Write("請求失敗!"); } } catch { Response.Write("系統異常!"); } }
其中在拼接biz_data數據的時候,商戶可根據情況來取舍,有些數據不用傳(看文檔要求)
/// <summary> /// 獲取json數據 /// </summary> /// <param name="orderModel"></param> /// <returns></returns> private string GetBizData(string OrderNo,decimal price) { StringBuilder sbJson = new StringBuilder(); //有些數據不必傳 sbJson.Append("{"); sbJson.AppendFormat("\"need_address\":\"{0}\",", "F");//是否需要收貨地址:T需要,F不需要 sbJson.AppendFormat("\"trade_type\":\"{0}\",", "1");//交易類型,1 即時到賬 sbJson.AppendFormat("\"notify_url\":\"{0}\",", "http://www.xxxxx.com/OnlinePay/AlipayQRCode/Notify_Url.aspx"); string goods = "\"goods_info\":{\"id\":\"" + OrderNo + "\",\"name\":\"" + OrderNo + "\",\"price\":\""+price+ "\"}"; sbJson.Append(goods); //sbJson.AppendFormat("\"memo\":{0}", "memo");備注 sbJson.Append("}"); return sbJson.ToString(); }
把正確的數據發送給支付寶服務器之后,支付寶對商戶提供的請求數據進行處理后,返回給商戶結果數據,以便商戶根據數據進一步處理(生成二維碼)
在建立請求這一步完成之后,即下面這一步:
string sHtmlText = Submit.BuildRequest(sParaTemp);
執行完了之后,服務器返回的正確的XML形式是這樣的:
<?xml version="1.0" encoding="utf-8"?> <alipay> <is_success>T</is_success> <request> <param name="sign">e4886e6ac2bdd177780291cac8275549</param> <param name="timestamp">2015-04-09 18:02:02</param> <param name="_input_charset">utf-8</param> <param name="biz_type">10</param> <param name="biz_data">{"need_address":"F","trade_type":"1","notify_url":"http://www.xxxxx.com/OnlinePay/AlipayQRCode/Notify_Url.aspx","goods_info":{"id":"130723565644339531","name":"130723565644339531","price":"58.90"}}</param> <param name="sign_type">MD5</param> <param name="service">alipay.mobile.qrcode.manage</param> <param name="method">add</param> <param name="partner">2088212334266517</param> </request> <response> <alipay> <qrcode>https://qr.alipay.com/gdcb3cplbcwmsu142b</qrcode> <qrcode_img_url>https://mobilecodec.alipay.com/show.htm?code=gdcb3cplbcwmsu142b&anp;picSize=S</qrcode_img_url> <result_code>SUCCESS</result_code> </alipay> </response> <sign>f30b5b091676cefdcbc1c67b04463178</sign> <sign_type>MD5</sign_type> </alipay>
至於其他情況返回的數據,請看文檔中5.3,上面有詳細的說明。
返回的數據中,在:
<response> <alipay> <qrcode>https://qr.alipay.com/gdcb3cplbcwmsu142b</qrcode> <qrcode_img_url>https://mobilecodec.alipay.com/show.htm?code=gdcb3cplbcwmsu142b&anp;picSize=S</qrcode_img_url> <result_code>SUCCESS</result_code> </alipay> </response>
里面就是二維碼圖片的鏈接地址和二維碼的地址,然后我們就可以通過將二維碼圖片的地址提取出來,然后賦值到一個圖片標簽的src屬性上即能顯示出二維碼圖片了
//顯示二維碼
Response.Redirect("/CreateQRCode.aspx?URL=" + qrcode_img_url + "&orderno=" +orderNo + "&cashm=" + totalPrice);
CreateQRCode.aspx頁面中代碼:
展示效果圖為:
至此,二維碼生成!在用戶掃描了二維碼之后,支付寶服務器會將用戶的交易結果返回給我們處理,我會在下一篇博客詳細的說明。