C#.Net對接支付寶支付功能的介紹

2022-01-09 16:00:01

需求:我的平臺是會員制的,會員分多級,每一級都需要收款功能,如下:

2015年對接支付寶支付功能時需要3個引數:alipay_id、alipay_key、seller_email,同一個平臺申請帳號完成對接,官方程式碼範例基本沒有封裝,方便根據自己的業務自由封裝。對接比較順利,沒有遇到問題。

2022年收到官方提醒原介面將下線,所以需要重新對接,需要3個引數:應用APPID商戶私鑰支付寶公鑰,官網給的範例原始碼做了封裝。

首先建議先閱讀檔案:網頁&移動應用學習路徑 | 網頁&移動應用

一、對接流程我總結如下:

1、註冊商戶帳號:登入 - 支付寶

2、註冊開放平臺帳號:支付寶開放平臺

3、在開放平臺建立應用;

這一步可獲取支付寶介面所需要的3個引數:

建立應用後可以得到「應用APPID」,設定介面加簽方式可以得到「商戶私鑰支付寶公鑰」。建議通過線上工具生成商戶私鑰,地址:https://miniu.alipay.com/keytool/match

4、在商戶平臺繫結應用;

二、以上操作完,可以進入寫程式碼對接環節:

可直接參照官網釋出的SDK,建議使用官方原始碼範例.Net,PHP,JAVA測試:

//下載範例原始碼
https://open.alipay.com/api/detail?abilityCode=SM010000000000001013

如果您的專案做了加簽可能編譯失敗,因為官方釋出的SDK沒有加簽,可下載SDK專案原始碼,自己編譯並加簽,然後專案參照自己生成的DLL:

//官網SDK原始碼
https://github.com/stulzq/Alipay.AopSdk.Core

三、提供我的原始碼供參考:

1、電腦端網頁支付

/// <summary>
/// 電腦端下單 
/// </summary>
/// <param name="payConfig">自定義的引數類</param>
/// <param name="zfmodel">SDK封裝的電腦網站支付業務類</param>
/// <returns></returns>
public string PagePay(AlipayConfig payConfig, AlipayTradePagePayModel zfmodel)
{
    AlipayHelper hleper = new AlipayHelper();
    DefaultAopClient alipayClient = GetClient(payConfig);
    AlipayTradePagePayRequest request = new();

    //頁面跳轉同步通知頁面路徑,這句程式碼可以註釋
    alipayClient.return_url = payConfig.return_url;
    //伺服器非同步通知頁面路徑,這句程式碼可以註釋
    alipayClient.notify_url = payConfig.notify_url;
    request.SetBizModel(zfmodel);
    //request.method = "alipay.trade.page.pay";//這裡可以不寫,已被封裝
    //request.SetApiVersion("1.0");//這裡可以不寫,已被封裝
    request.SetReturnUrl(payConfig.return_url);
    request.SetNotifyUrl(payConfig.notify_url);

    AlipayTradePagePayResponse response = alipayClient.PageExecute(request);
    if (response.IsError)
    {
        Log4Helper.Error($"支付寶下單失敗:{response.OutTradeNo}, 錯誤:{response.Msg}");
        throw new Exception("支付失敗");
    }
    //下單成功
    return $"<p style='display:none;'>{response.Body}</p>";
}

AlipayConfig.cs

 public class AlipayConfig
    {

        /// <summary>
        /// 應用編號
        /// </summary>
        public string appId { set; get; }
        /// <summary>
        /// 私鑰
        /// </summary>
        public string privateKey { set; get; }
        /// <summary>
        /// 公鑰
        /// </summary>
        public string publicKey { set; get; }

        /// <summary>
        /// 商品展示地址,支付成功後立刻回跳展示給使用者看的頁面
        /// </summary>
        public string return_url { get; set; }

        /// <summary>
        /// 支付成功後的回撥通知
        /// </summary>
        public string notify_url { get; set; }

 
        public AlipayConfig()
        {

            if (zhf != null)
            {
                //介面引數, 這裡根據業務需要封裝介面引數的來源
                appId = "應用APPID";
                publicKey = "支付寶公鑰";
                privateKey  = "商戶私鑰";
            }
            else
            {
                //未設定支付引數將丟擲異常
                throw new Exception($"未設定支付引數");
            }

        }
}

2、支付寶支付成功後的回撥

public ActionResult alipay_notify_url()
{

    //此異常通知介面只返回以下兩個值 success  或者   fail
    string msg = "success";
    string fail = "fail";
    //獲取支付寶回撥中攜帶的引數
    SortedDictionary<string, string> sPara = GetRequestPost();

    if (sPara == null || sPara.Count == 0)
    {
        msg = "無通知引數";
        Log4Helper.Debug($"支付寶回撥空引數");
        return Content(fail);
    }
    else
    {
        Log4Helper.Debug($"支付寶回撥引數:{sPara.ToJson()}");
    }
    //商戶訂單號
    string out_trade_no = sPara["out_trade_no"];
    //訂單金額
    decimal total_fee = Convert.ToDecimal(sPara["buyer_pay_amount"]);
    //商戶號
    string seller_id = sPara["seller_id"];
    string app_id = sPara["app_id"];
    //交易狀態
    string trade_status = sPara["trade_status"];
    if (trade_status == "TRADE_SUCCESS")
    {
        //支付寶交易號
        string trade_no = sPara["trade_no"];

       Client client = new ();
        AlipayTradeQueryModel model = new()
        {
            OutTradeNo = out_trade_no,
            TradeNo = trade_no
        };
        //查詢訂單的真實性
        bool verifyResult = client.Query(alipayConfig, model);
        if (!verifyResult)
        {
            //驗證不是支付寶發來的請求
            return Content(fail);
        }
        
        //開發者繼續寫支付成功後的業務邏輯
    }
}

記得在回撥業務邏輯中要查詢訂單的真實性。

class Client {
    /// <summary>
    /// 查詢訂單
    /// </summary>
    /// <param name="config"></param>
    /// <param name=""></param>
    /// <returns></returns>
    public bool Query(AlipayConfig alipayConfig, AlipayTradeQueryModel model)
    {
        DefaultAopClient alipayClient = GetClient(alipayConfig);
        AlipayTradeQueryRequest request = new();
           
        request.SetBizModel(model);
        AlipayTradeQueryResponse response = alipayClient.Execute(request);
        if (response.IsError)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

至此 ,支付功能 關鍵點已介紹完。