1. 程式人生 > >.net實現支付寶線上支付

.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 = "
[email protected]
";//賣家郵箱  
            //商戶金鑰 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("支付失敗");
            }
        }