.net實現支付寶線上支付
流程參考《實物商品交易服務整合技術文件2.0.pdf》
閘道器地址http://paytest.rupeng.cn/AliPay/PayGate.ashx
閘道器引數說明:
partner:商戶編號
return_url:回撥商戶地址(通過商戶網站的哪個頁面來通知支付成功!)
subject:商品名稱
body:商品描述
out_trade_no:訂單號!!!(由商戶網站生成,支付寶不確保正確性,只負責轉發。)
total_fee:總金額
seller_email:賣家郵箱
sign:數字簽名。
為按順序連線 (總金額、 商戶編號、訂單號、商品名稱、商戶金鑰)的MD5值。
重定向的url("http://paytest.rupeng.cn/AliPay/PayGate.ashx?partner="
+ partner + "&return_url=" + Server.UrlEncode(return_url)
+ "&subject="
+ Server.UrlEncode(subject)
+ "&body=" + Server.UrlEncode(body)
+ "&out_trade_no=" + out_trade_no
+ "&total_fee=" + total_fee + "&seller_email="
+ Server.UrlEncode(seller_email) + "&sign=" + sign)
回撥商戶介面地址引數說明:
out_trade_no :訂單號。給PayGate.ashx傳過去的out_trade_no再傳回來
returncode :返回碼,字串。ok為支付成功,error為支付失敗。
total_fee :支付金額
sign :數字簽名。為按順序連線 (訂單號、返回碼、支付金額、商戶金鑰)為新字串的MD5值。
(每個商戶的金鑰是商戶自己設定的,每個人的都不一樣,只有支付寶和商戶知道,所以無法猜測、假冒)
MD5演算法要用以下的,大小寫都不能錯:
/// <summary>
/// 得到字串的MD5雜湊值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static String GetMD5(this string input)
{
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
return s.ToString();
}
/// <summary>
/// 付款/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Unnamed1_Click(object sender, EventArgs e)
{
string partner = "2";//商戶編號
string return_url = "http://localhost:5059/ReturnPage.ashx";//回撥商戶地址(通過商戶網站的哪個頁面來通知支付成功!)
string subject = "飛機"; //商品名稱
string body = "非常大的飛機"; //商品描述
string out_trade_no = "aaabbb888"; //訂單號!(由商戶網站生成,支付寶不確保正確性,只負責轉發。)
string total_fee = "9"; //總金額
string seller_email = "
//商戶金鑰 abc123//不要寫到url中
//為按順序連線 (總金額、 商戶編號、訂單號、商品名稱、商戶金鑰)的MD5值。
string sign = CommonHelper.getMD5Str(total_fee + partner + out_trade_no + subject + "abc123");//數字簽名。
Response.Redirect("http://paytest.rupeng.cn/AliPay/PayGate.ashx?partner="
+ partner + "&return_url=" + Server.UrlEncode(return_url) + "&subject=" + Server.UrlEncode(subject) + "&body=" + Server.UrlEncode(body) + "&out_trade_no=" + out_trade_no + "&total_fee=" + total_fee + "&seller_email=" + Server.UrlEncode(seller_email) + "&sign=" + sign);
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
context.Response.Write("支付寶訊息返回到了我的商戶網站的這個頁面\r\n");
string out_trade_no = context.Request["out_trade_no"];//訂單號。給PayGate.ashx傳過去的out_trade_no再傳回來
string returncode = context.Request["returncode"];//返回碼,字串。ok為支付成功,error為支付失敗。
string total_fee = context.Request["total_fee"];//支付金額
string sign = context.Request["sign"];//支付寶端返回 的數字簽名
string MySign = CommonHelper.getMD5Str(out_trade_no + returncode + total_fee + "abc123");//為按順序連線 (訂單號、返回碼、支付金額、商戶金鑰)為新字串的MD5值。
if (sign!=MySign)
{
//提交的資料 =驗證失敗
context.Response.Write("提交的資料 =驗證失敗");
return;
}
if (returncode=="ok")
{
context.Response.Write("支付成功");
}
else if (returncode == "error")
{
context.Response.Write("支付失敗");
}
}