需求:我的平臺是會員制的,會員分多級,每一級都需要收款功能,如下:
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;
}
}
}
至此 ,支付功能 關鍵點已介紹完。