.NET ASP.NET支付寶支付接口調用實現


此接口APP_Code下一共五個類介紹注釋詳細,代碼如下,連個web窗體分別為同步異步,和點擊去支付的點擊事件,log文件夾,本人個人自己新添加的注釋都有提出標注,接口壓縮包地址也會留在下方。

  1. AlipayConfig.cs代碼如下,需要傳入的參數有以2088開頭合作身份者ID簽約賬號、MD5格式的密鑰、同步路徑、異步路徑。
using System.Web;
using System.Text;
using System.IO;
using System.Net;
using System;
using System.Collections.Generic;

namespace Com.Alipay
{
    /// <summary>
    /// 類名:Config
    /// 功能:基礎配置類
    /// 詳細:設置帳戶有關信息及返回路徑
    /// 版本:3.4
    /// 修改日期:2016-03-08
    /// 說明:
    /// 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
    /// 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
    /// </summary>
    public class Config
    {

        //↓↓↓↓↓↓↓↓↓↓請在這里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

        // 合作身份者ID,簽約賬號,以2088開頭由16位純數字組成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
        public static string partner = "";

        // 收款支付寶賬號,以2088開頭由16位純數字組成的字符串,一般情況下收款賬號就是簽約賬號
        public static string seller_id = partner;
		
        // MD5密鑰,安全檢驗碼,由數字和字母組成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
        public static string key = "";

        // 服務器異步通知頁面路徑,需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問;//"http://商戶網關地址/alipay.wap.create.direct.pay.by.user-CSHARP-UTF-8/notify_url.aspx";

        public static string notify_url = "http://........./notify_url.aspx"; 

        // 頁面跳轉同步通知頁面路徑,需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問;//http://商戶網關地址/alipay.wap.create.direct.pay.by.user-CSHARP-UTF-8/return_url.aspx

        public static string return_url = "http://....../return_url.aspx";

        // 簽名方式
        public static string sign_type = "MD5";

        // 調試用,創建TXT日志文件夾路徑,見AlipayCore.cs類中的LogResult(string sWord)打印方法。
        public static string log_path = HttpRuntime.AppDomainAppPath.ToString() + "log\\";

        // 字符編碼格式 目前支持utf-8
        public static string input_charset = "utf-8";

        // 支付類型 ,無需修改
        public static string payment_type = "1";

        // 調用的接口名,無需修改
        public static string service = "alipay.wap.create.direct.pay.by.user"; //手機:alipay.wap.create.direct.pay.by.user

        //↑↑↑↑↑↑↑↑↑↑請在這里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    }
}
  1. AlipayCore.cs代碼如下該類是請求、通知返回兩個文件所調用的公用函數核心處理文件,不需要修改
using System.Web;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Net;
using System;
using System.Collections.Generic;
using System.Xml;

namespace Com.Alipay
{
    /// <summary>
    /// 類名:Core
    /// 功能:支付寶接口公用函數類
    /// 詳細:該類是請求、通知返回兩個文件所調用的公用函數核心處理文件,不需要修改
    /// 版本:3.4
    /// 修改日期:2016-03-08
    /// 說明:
    /// 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
    /// 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
    /// </summary>
    public class Core
    {

        public Core()
        {
        }

        /// <summary>
        /// 除去數組中的空值和簽名參數並以字母a到z的順序排序
        /// </summary>
        /// <param name="dicArrayPre">過濾前的參數組</param>
        /// <returns>過濾后的參數組</returns>
        public static Dictionary<string, string> FilterPara(SortedDictionary<string, string> dicArrayPre)
        {
            Dictionary<string, string> dicArray = new Dictionary<string, string>();
            foreach (KeyValuePair<string, string> temp in dicArrayPre)
            {
                if (temp.Key.ToLower() != "sign" && temp.Key.ToLower() != "sign_type" && temp.Value != "" && temp.Value != null)
                {
                    dicArray.Add(temp.Key, temp.Value);
                }
            }

            return dicArray;
        }

        /// <summary>
        /// 把數組所有元素,按照“參數=參數值”的模式用“&”字符拼接成字符串
        /// </summary>
        /// <param name="sArray">需要拼接的數組</param>
        /// <returns>拼接完成以后的字符串</returns>
        public static string CreateLinkString(Dictionary<string, string> dicArray)
        {
            StringBuilder prestr = new StringBuilder();
            foreach (KeyValuePair<string, string> temp in dicArray)
            {
                prestr.Append(temp.Key + "=" + temp.Value + "&");
            }

            //去掉最後一個&字符
            int nLen = prestr.Length;
            prestr.Remove(nLen-1,1);

            return prestr.ToString();
        }

        /// <summary>
        /// 把數組所有元素,按照“參數=參數值”的模式用“&”字符拼接成字符串,並對參數值做urlencode
        /// </summary>
        /// <param name="sArray">需要拼接的數組</param>
        /// <param name="code">字符編碼</param>
        /// <returns>拼接完成以后的字符串</returns>
        public static string CreateLinkStringUrlencode(Dictionary<string, string> dicArray, Encoding code)
        {
            StringBuilder prestr = new StringBuilder();
            foreach (KeyValuePair<string, string> temp in dicArray)
            {
                prestr.Append(temp.Key + "=" + HttpUtility.UrlEncode(temp.Value, code) + "&");
            }

            //去掉最後一個&字符
            int nLen = prestr.Length;
            prestr.Remove(nLen - 1, 1);

            return prestr.ToString();
        }

        /// <summary>
        /// 寫日志,方便測試(看網站需求,也可以改成把記錄存入數據庫)
        /// </summary>
        /// <param name="sWord">要寫入日志里的文本內容</param>
        public static void LogResult(string sWord)
        {
            string strPath = Config.log_path + "\\" + "alipay_log_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
            StreamWriter fs = new StreamWriter(strPath, false, System.Text.Encoding.Default);
            fs.Write(sWord);
            fs.Close();
        }

        /// <summary>
        /// 獲取文件的md5摘要
        /// </summary>
        /// <param name="sFile">文件流</param>
        /// <returns>MD5摘要結果</returns>
        public static string GetAbstractToMD5(Stream sFile)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] result = md5.ComputeHash(sFile);
            StringBuilder sb = new StringBuilder(32);
            for (int i = 0; i < result.Length; i++)
            {
                sb.Append(result[i].ToString("x").PadLeft(2, '0'));
            }
            return sb.ToString();
        }

        /// <summary>
        /// 獲取文件的md5摘要
        /// </summary>
        /// <param name="dataFile">文件流</param>
        /// <returns>MD5摘要結果</returns>
        public static string GetAbstractToMD5(byte[] dataFile)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] result = md5.ComputeHash(dataFile);
            StringBuilder sb = new StringBuilder(32);
            for (int i = 0; i < result.Length; i++)
            {
                sb.Append(result[i].ToString("x").PadLeft(2, '0'));
            }
            return sb.ToString();
        }
    }
}
  1. AlipayNotify.cs
using System.Web;
using System.Text;
using System.IO;
using System.Net;
using System;
using System.Collections.Generic;

namespace Com.Alipay
{
    /// <summary>
    /// 類名:Notify
    /// 功能:支付寶通知處理類
    /// 詳細:處理支付寶各接口通知返回
    /// 版本:3.3
    /// 修改日期:2011-07-05
    /// '說明:
    /// 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
    /// 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
    /// 
    /// //////////////////////注意/////////////////////////////
    /// 調試通知返回時,可查看或改寫log日志的寫入TXT里的數據,來檢查通知返回是否正常 
    /// </summary>
    public class Notify
    {
        #region 字段
        private string _partner = "";               //合作身份者ID
        private string _key = "";                   //商戶的私鑰
        private string _input_charset = "";         //編碼格式
        private string _sign_type = "";             //簽名方式

        //支付寶消息驗證地址
        private string Https_veryfy_url = "https://mapi.alipay.com/gateway.do?service=notify_verify&";
        #endregion


        /// <summary>
        /// 構造函數
        /// 從配置文件中初始化變量
        /// </summary>
        /// <param name="inputPara">通知返回參數數組</param>
        /// <param name="notify_id">通知驗證ID</param>
        public Notify()
        {
            //初始化基礎配置信息
            _partner = Config.partner.Trim();
            _key = Config.key.Trim();
            _input_charset = Config.input_charset.Trim().ToLower();
            _sign_type = Config.sign_type.Trim().ToUpper();
        }
		
		 /// <summary>
        /// 從文件讀取公鑰轉公鑰字符串
        /// </summary>
        /// <param name="Path">公鑰文件路徑</param>
        public static string getPublicKeyStr(string Path)
        {
            StreamReader sr = new StreamReader(Path);
            string pubkey = sr.ReadToEnd();
            sr.Close();
            if (pubkey != null)
            {
                pubkey = pubkey.Replace("-----BEGIN PUBLIC KEY-----", "");
                pubkey = pubkey.Replace("-----END PUBLIC KEY-----", "");
                pubkey = pubkey.Replace("\r", "");
                pubkey = pubkey.Replace("\n", "");
            }
            return pubkey;
        }

        /// <summary>
        /// 驗證消息是否是支付寶發出的合法消息
        /// </summary>
        /// <param name="inputPara">通知返回參數數組</param>
        /// <param name="notify_id">通知驗證ID</param>
        /// <param name="sign">支付寶生成的簽名結果</param>
        /// <returns>驗證結果</returns>
        public bool Verify(SortedDictionary<string, string> inputPara, string notify_id, string sign)
        {
            //獲取返回時的簽名驗證結果
            bool isSign = GetSignVeryfy(inputPara, sign);
            //獲取是否是支付寶服務器發來的請求的驗證結果
            string responseTxt = "false";
            if (notify_id != null && notify_id != "") { responseTxt = GetResponseTxt(notify_id); }

            //寫日志記錄(若要調試,請取消下面兩行注釋)
            //string sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign.ToString() + "\n 返回回來的參數:" + GetPreSignStr(inputPara) + "\n ";
            //Core.LogResult(sWord);

            //判斷responsetTxt是否為true,isSign是否為true
            //responsetTxt的結果不是true,與服務器設置問題、合作身份者ID、notify_id一分鍾失效有關
            //isSign不是true,與安全校驗碼、請求時的參數格式(如:帶自定義參數等)、編碼格式有關
            if (responseTxt == "true" && isSign)//驗證成功
            {
                return true;
            }
            else//驗證失敗
            {
                return false;
            }
        }

        /// <summary>
        /// 獲取待簽名字符串(調試用)
        /// </summary>
        /// <param name="inputPara">通知返回參數數組</param>
        /// <returns>待簽名字符串</returns>
        private string GetPreSignStr(SortedDictionary<string, string> inputPara)
        {
            Dictionary<string, string> sPara = new Dictionary<string, string>();

            //過濾空值、sign與sign_type參數
            sPara = Core.FilterPara(inputPara);

            //獲取待簽名字符串
            string preSignStr = Core.CreateLinkString(sPara);

            return preSignStr;
        }

        /// <summary>
        /// 獲取返回時的簽名驗證結果
        /// </summary>
        /// <param name="inputPara">通知返回參數數組</param>
        /// <param name="sign">對比的簽名結果</param>
        /// <returns>簽名驗證結果</returns>
        private bool GetSignVeryfy(SortedDictionary<string, string> inputPara, string sign)
        {
            Dictionary<string, string> sPara = new Dictionary<string, string>();

            //過濾空值、sign與sign_type參數
            sPara = Core.FilterPara(inputPara);
            
            //獲取待簽名字符串
            string preSignStr = Core.CreateLinkString(sPara);

            //獲得簽名驗證結果
            bool isSgin = false;
            if (sign != null && sign != "")
            {
                switch (_sign_type)
                {
                    case "MD5":
                        isSgin = AlipayMD5.Verify(preSignStr, sign, _key, _input_charset);
                        break;
                    default:
                        break;
                }
            }

            return isSgin;
        }

        /// <summary>
        /// 獲取是否是支付寶服務器發來的請求的驗證結果
        /// </summary>
        /// <param name="notify_id">通知驗證ID</param>
        /// <returns>驗證結果</returns>
        private string GetResponseTxt(string notify_id)
        {
            string veryfy_url = Https_veryfy_url + "partner=" + _partner + "&notify_id=" + notify_id;

            //獲取遠程服務器ATN結果,驗證是否是支付寶服務器發來的請求
            string responseTxt = Get_Http(veryfy_url, 120000);

            return responseTxt;
        }

        /// <summary>
        /// 獲取遠程服務器ATN結果
        /// </summary>
        /// <param name="strUrl">指定URL路徑地址</param>
        /// <param name="timeout">超時時間設置</param>
        /// <returns>服務器ATN結果</returns>
        private string Get_Http(string strUrl, int timeout)
        {
            string strResult;
            try
            {
                HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(strUrl);
                myReq.Timeout = timeout;
                HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
                Stream myStream = HttpWResp.GetResponseStream();
                StreamReader sr = new StreamReader(myStream, Encoding.Default);
                StringBuilder strBuilder = new StringBuilder();
                while (-1 != sr.Peek())
                {
                    strBuilder.Append(sr.ReadLine());
                }

                strResult = strBuilder.ToString();
            }
            catch (Exception exp)
            {
                strResult = "錯誤:" + exp.Message;
            }

            return strResult;
        }
    }
}
  1. AlipaySubmit.cs
using System.Web;
using System.Text;
using System.IO;
using System.Net;
using System;
using System.Collections.Generic;
using System.Xml;

namespace Com.Alipay
{
    /// <summary>
    /// 類名:Submit
    /// 功能:支付寶各接口請求提交類
    /// 詳細:構造支付寶各接口表單HTML文本,獲取遠程HTTP數據
    /// 版本:3.3
    /// 修改日期:2011-07-05
    /// 說明:
    /// 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
    /// 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考
    /// </summary>
    public class Submit
    {
        #region 字段
        //支付寶網關地址(新)
        private static string GATEWAY_NEW = "https://mapi.alipay.com/gateway.do?";
        //商戶的私鑰
        private static string _key = "";
        //編碼格式
        private static string _input_charset = "";
        //簽名方式
        private static string _sign_type = "";
        #endregion

        static Submit()
        {
            _key = Config.key.Trim();
            _input_charset = Config.input_charset.Trim().ToLower();
            _sign_type = Config.sign_type.Trim().ToUpper();
        }

        /// <summary>
        /// 生成請求時的簽名
        /// </summary>
        /// <param name="sPara">請求給支付寶的參數數組</param>
        /// <returns>簽名結果</returns>
        private static string BuildRequestMysign(Dictionary<string, string> sPara)
        {
            //把數組所有元素,按照“參數=參數值”的模式用“&”字符拼接成字符串
            string prestr = Core.CreateLinkString(sPara);

            //把最終的字符串簽名,獲得簽名結果
            string mysign = "";
            switch (_sign_type)
            {
                case "MD5":
                    mysign = AlipayMD5.Sign(prestr, _key, _input_charset);
                    break;
                default:
                    mysign = "";
                    break;
            }

            return mysign;
        }

        /// <summary>
        /// 生成要請求給支付寶的參數數組
        /// </summary>
        /// <param name="sParaTemp">請求前的參數數組</param>
        /// <returns>要請求的參數數組</returns>
        private static Dictionary<string, string> BuildRequestPara(SortedDictionary<string, string> sParaTemp)
        {
            //待簽名請求參數數組
            Dictionary<string, string> sPara = new Dictionary<string, string>();
            //簽名結果
            string mysign = "";

            //過濾簽名參數數組
            sPara = Core.FilterPara(sParaTemp);

            //獲得簽名結果
            mysign = BuildRequestMysign(sPara);

            //簽名結果與簽名方式加入請求提交參數組中
            sPara.Add("sign", mysign);
            sPara.Add("sign_type", _sign_type);

            return sPara;
        }

        /// <summary>
        /// 生成要請求給支付寶的參數數組
        /// </summary>
        /// <param name="sParaTemp">請求前的參數數組</param>
        /// <param name="code">字符編碼</param>
        /// <returns>要請求的參數數組字符串</returns>
        private static string BuildRequestParaToString(SortedDictionary<string, string> sParaTemp, Encoding code)
        {
            //待簽名請求參數數組
            Dictionary<string, string> sPara = new Dictionary<string, string>();
            sPara = BuildRequestPara(sParaTemp);

            //把參數組中所有元素,按照“參數=參數值”的模式用“&”字符拼接成字符串,並對參數值做urlencode
            string strRequestData = Core.CreateLinkStringUrlencode(sPara, code);

            return strRequestData;
        }

        /// <summary>
        /// 建立請求,以表單HTML形式構造(默認)
        /// </summary>
        /// <param name="sParaTemp">請求參數數組</param>
        /// <param name="strMethod">提交方式。兩個值可選:post、get</param>
        /// <param name="strButtonValue">確認按鈕顯示文字</param>
        /// <returns>提交表單HTML文本</returns>
        public static string BuildRequest(SortedDictionary<string, string> sParaTemp, string strMethod, string strButtonValue)
        {
            //待請求參數數組
            Dictionary<string, string> dicPara = new Dictionary<string, string>();
            dicPara = BuildRequestPara(sParaTemp);

            StringBuilder sbHtml = new StringBuilder();

            sbHtml.Append("<form id='alipaysubmit' name='alipaysubmit' action='" + GATEWAY_NEW + "_input_charset=" + _input_charset + "' method='" + strMethod.ToLower().Trim() + "'>");

            foreach (KeyValuePair<string, string> temp in dicPara)
            {
                sbHtml.Append("<input type='hidden' name='" + temp.Key + "' value='" + temp.Value + "'/>");
            }

            //submit按鈕控件請不要含有name屬性
            sbHtml.Append("<input type='submit' value='" + strButtonValue + "' style='display:none;'></form>");

            sbHtml.Append("<script>document.forms['alipaysubmit'].submit();</script>");

            return sbHtml.ToString();
        }



        /// <summary>
        /// 用於防釣魚,調用接口query_timestamp來獲取時間戳的處理函數
        /// 注意:遠程解析XML出錯,與IIS服務器配置有關
        /// </summary>
        /// <returns>時間戳字符串</returns>
        public static string Query_timestamp()
        {
            string url = GATEWAY_NEW + "service=query_timestamp&partner=" + Config.partner + "&_input_charset=" + Config.input_charset;
            string encrypt_key = "";

            XmlTextReader Reader = new XmlTextReader(url);
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(Reader);

            encrypt_key = xmlDoc.SelectSingleNode("/alipay/response/timestamp/encrypt_key").InnerText;

            return encrypt_key;
        }
    }
}
  1. MD5.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security.Cryptography;

namespace Com.Alipay
{
    /// <summary>
    /// 類名:MD5
    /// 功能:MD5加密
    /// 版本:3.3
    /// 修改日期:2012-07-05
    /// 說明:
    /// 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
    /// 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
    /// </summary>
    public sealed class AlipayMD5
    {
        public AlipayMD5()
        {
            //
            // TODO: 在此處添加構造函數邏輯
            //
        }

        /// <summary>
        /// 簽名字符串
        /// </summary>
        /// <param name="prestr">需要簽名的字符串</param>
        /// <param name="key">密鑰</param>
        /// <param name="_input_charset">編碼格式</param>
        /// <returns>簽名結果</returns>
        public static string Sign(string prestr, string key, string _input_charset)
        {
            StringBuilder sb = new StringBuilder(32);

            prestr = prestr + key;

            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(prestr));
            for (int i = 0; i < t.Length; i++)
            {
                sb.Append(t[i].ToString("x").PadLeft(2, '0'));
            }

            return sb.ToString();
        }

        /// <summary>
        /// 驗證簽名
        /// </summary>
        /// <param name="prestr">需要簽名的字符串</param>
        /// <param name="sign">簽名結果</param>
        /// <param name="key">密鑰</param>
        /// <param name="_input_charset">編碼格式</param>
        /// <returns>驗證結果</returns>
        public static bool Verify(string prestr, string sign, string key, string _input_charset)
        {
            string mysign = Sign(prestr, key, _input_charset);
            if (mysign == sign)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}
  1. 支付按鈕點擊事件(需要傳入參數)商戶訂單號、訂單名稱、
/// <summary>
/// 功能:手機網站支付接口接入頁
/// 版本:3.4
/// 修改日期:2016-03-08
/// 說明:
/// 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
/// 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
/// 
/// /////////////////注意///////////////////////////////////////////////////////////////
/// 如果您在接口集成過程中遇到問題,可以按照下面的途徑來解決
/// 1、開發文檔中心(https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.2Z6TSk&treeId=60&articleId=103693&docType=1)
/// 2、商戶幫助中心(https://cshall.alipay.com/enterprise/help_detail.htm?help_id=473888)
/// 3、支持中心(https://support.open.alipay.com/alipay/support/index.htm)
/// 如果不想使用擴展功能請把擴展功能參數賦空值。
/// </summary>
protected void BtnAlipay_Click(object sender, EventArgs e)
{
    //個人注釋:在這一塊獲取支付類型判斷為支付寶支付(例:paymenttype參數為支付類型,0:支付寶支付,1:微信支付,2:財付通,.....)
    if (paymenttype == 0)//支付寶支付
    {
        ////////////////////////////////////////////請求參數////////////////////////////////////////////

        //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
        string out_trade_no = showindent.OrderNO;//個人注釋:此訂單號為個人訂單號,注意和支付寶支付返回的訂單號分清,我一般是年月日時分秒毫秒加上四位隨機數(必填參數哦,此處要傳入參數)
        
        //訂單名稱,必填
        string subject = "";//個人注釋:商品名稱商品標題....

        //付款金額,必填
        string total_fee ="";//個人注釋:商品此訂單的總價

        //收銀台頁面上,商品展示的超鏈接,必填
        string show_url = "";//個人注釋:商品展示的了解,你自己網站的鏈接主頁面鏈接都可以,給個鏈接,必填

        //商品描述,可空
        string body = "";


        ////////////////////////////////////////////////////////////////////////////////////////////////

        //把請求參數打包成數組
        SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
        sParaTemp.Add("partner", Config.partner);
        sParaTemp.Add("seller_id", Config.seller_id);
        sParaTemp.Add("_input_charset", Config.input_charset.ToLower());
        sParaTemp.Add("service", Config.service);
        sParaTemp.Add("payment_type", Config.payment_type);
        sParaTemp.Add("notify_url", Config.notify_url);
        sParaTemp.Add("return_url", Config.return_url);
        sParaTemp.Add("out_trade_no", out_trade_no);
        sParaTemp.Add("subject", subject);
        sParaTemp.Add("total_fee", total_fee);
        sParaTemp.Add("show_url", show_url);
        //sParaTemp.Add("app_pay","Y");//啟用此參數可喚起錢包APP支付。
        sParaTemp.Add("body", body);
        //其他業務參數根據在線開發文檔,添加參數.文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.2Z6TSk&treeId=60&articleId=103693&docType=1
        //如sParaTemp.Add("參數名","參數值");

        //建立請求
        string sHtmlText = Submit.BuildRequest(sParaTemp, "get", "確認");
        Response.Write(sHtmlText);
    }
}
  1. notify_url.aspx和notify_url.aspx.cs異步通知,例如支付成功后需要對自己的訂單進行修改
    notify_url.aspx創建后把前台代碼刪掉只留下發一句就可。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="notify_url.aspx.cs" Inherits="QiYeZhan.url.notify_url" %>

后台:

using Com.Alipay;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace QiYeZhan.url
{
    /// <summary>
    /// 功能:服務器異步通知頁面
    /// 版本:3.3
    /// 日期:2012-07-10
    /// 說明:
    /// 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
    /// 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
    /// 
    /// ///////////////////頁面功能說明///////////////////
    /// 創建該頁面文件時,請留心該頁面文件中無任何HTML代碼及空格。
    /// 該頁面不能在本機電腦測試,請到服務器上做測試。請確保外部可以訪問該頁面。
    /// 該頁面調試工具請使用寫文本函數logResult。
    /// 如果沒有收到該頁面返回的 success 信息,支付寶會在24小時內按一定的時間策略重發通知
    
    public partial class notify_url : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            SortedDictionary<string, string> sPara = GetRequestPost();

            if (sPara.Count > 0)//判斷是否有帶返回參數
            {
                Notify aliNotify = new Notify();
                bool verifyResult = aliNotify.Verify(sPara, Request.Form["notify_id"], Request.Form["sign"]);

                if (verifyResult)//驗證成功
                {
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //請在這里加上商戶的業務邏輯程序代碼


                    //——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——
                    //獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表

                    //商戶訂單號

                    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)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
                        //請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id為一致的
                        //如果有做過處理,不執行商戶的業務程序

                        //注意:
                        //退款日期超過可退款期限后(如三個月可退款),支付寶系統發送該交易狀態通知 
						
						//個人注釋:此判斷代表着支付成功,可以在此處寫一些自己的處理代碼例如修改數據庫自己要修改的參數支付狀態等等。下面的else if 判斷也代表這支付成功這個判斷可以修改為if(Request.Form["trade_status"] == "TRADE_FINISHED"||Request.Form["trade_status"] == "TRADE_SUCCESS"){處理代碼}else{},else是可以為空的不用代碼,根據個人需要。
						
                    }
                    else if (Request.Form["trade_status"] == "TRADE_SUCCESS")
                    {
                        //判斷該筆訂單是否在商戶網站中已經做過處理
                        //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
                        //請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id為一致的
                        //如果有做過處理,不執行商戶的業務程序

                        //注意:
                        //付款完成后,支付寶系統發送該交易狀態通知
                        
                        
                    }
                    else
                    {

                    }

                    //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——

                    Response.Write("success");  //請不要修改或刪除

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//驗證失敗
                {
                    Response.Write("fail");
                }
            }
            else
            {
                Response.Write("無通知參數");
            }
        }

        /// <summary>
        /// 獲取支付寶POST過來通知消息,並以“參數名=參數值”的形式組成數組
        /// </summary>
        /// <returns>request回來的信息組成的數組</returns>
        public SortedDictionary<string, string> GetRequestPost()
        {
            int i = 0;
            SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
            NameValueCollection coll;
            //Load Form variables into NameValueCollection variable.
            coll = Request.Form;

            // Get names of all forms into a string array.
            String[] requestItem = coll.AllKeys;

            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
            }

            return sArray;
        }
    }
}
  1. return_url.aspx和return_url.aspx.cs同步通知頁面,跟異步大體相同
    return_url.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="return_url.aspx.cs" Inherits="QiYeZhan.url.return_url" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>

return_url.aspx.cs

using Com.Alipay;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


/// <summary>
/// 功能:頁面跳轉同步通知頁面
/// 版本:3.3
/// 日期:2012-07-10
/// 說明:
/// 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
/// 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
/// 
/// ///////////////////////頁面功能說明///////////////////////
/// 該頁面可在本機電腦測試
/// 可放入HTML等美化頁面的代碼、商戶業務邏輯程序代碼
/// 該頁面可以使用ASP.NET開發工具調試,也可以使用寫文本函數LogResult進行調試
/// </summary>
namespace QiYeZhan.url
{
    public partial class return_url : System.Web.UI.Page
    {
        
        protected void Page_Load(object sender, EventArgs e)
        {
            SortedDictionary<string, string> sPara = GetRequestGet();

            if (sPara.Count > 0)//判斷是否有帶返回參數
            {
                Notify aliNotify = new Notify();
                bool verifyResult = aliNotify.Verify(sPara, Request.QueryString["notify_id"], Request.QueryString["sign"]);

                if (verifyResult)//驗證成功
                {
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //請在這里加上商戶的業務邏輯程序代碼


                    //——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——
                    //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表

                    //商戶訂單號

                    string out_trade_no = Request.QueryString["out_trade_no"];//2019100

                    //支付寶交易號

                    string trade_no = Request.QueryString["trade_no"];

                    //交易狀態
                    string trade_status = Request.QueryString["trade_status"];


                    if (Request.QueryString["trade_status"] == "TRADE_FINISHED" || Request.QueryString["trade_status"] == "TRADE_SUCCESS")
                    {
                        //判斷該筆訂單是否在商戶網站中已經做過處理
                        //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
                        //如果有做過處理,不執行商戶的業務程序
                    }
                    else
                    {
                        Response.Write("trade_status=" + Request.QueryString["trade_status"]);
                    }

                    //打印頁面
                    Response.Write("驗證成功<br />");

                    //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//驗證失敗
                {
                    Response.Write("驗證失敗");
                }
            }
            else
            {
                Response.Write("無返回參數");
            }
        }
        /// <summary>
        /// 獲取支付寶GET過來通知消息,並以“參數名=參數值”的形式組成數組
        /// </summary>
        /// <returns>request回來的信息組成的數組</returns>
        public SortedDictionary<string, string> GetRequestGet()
        {
            int i = 0;
            SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
            NameValueCollection coll;
            //Load Form variables into NameValueCollection variable.
            coll = Request.QueryString;

            // Get names of all forms into a string array.
            String[] requestItem = coll.AllKeys;

            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i], Request.QueryString[requestItem[i]]);
            }

            return sArray;
        }
    }
}
  1. 在項目下鍵一個log文件夾,
    log.txt

    集成時請注意:
    本文件log.txt 可以刪除。
    log文件夾須保留。
  2. 支付接口壓縮包地址:https://download.csdn.net/download/qq_43434300/11960705


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM