最近做了支付寶小程序對接芝麻信用的功能,其實坑挺多的,不過還好在文檔以及客服的幫助下順利完成。
網上有很多相關的博客,但是百分之九十的沒啥用,要麼就是沒有代碼示例,要麼就是代碼不全,根本不能用,還有幾年前的博客 一些接口比如查詢芝麻信用分的接口,問了客服才知道 這個早就淘汰了。所以自己寫一篇比較詳細的供大家參考。一定要記住的一句話是--------遇到問題問客服
流程的話篇博客寫的完全正確:https://blog.csdn.net/webnoties/article/details/103255674
官方文檔:https://opendocs.alipay.com/open/11157/qlsxya
其實需要我們做的一共三步
第一步:調用資金凍結接口-----調用這個接口,你不必知道客戶的信用分夠不夠,你提交數據後支付寶那邊自己會判斷,夠的話就使用信用付,不夠的話就是普通的資金凍結。
第二步:將資金凍結接口返回的數據傳給前端,前端通過這些數據去調起用戶支付寶,用戶進行授權(信用分夠,使用信用付)/支付(信用分不夠,普通的資金凍結---這個時候注意 普通的資金凍結,錢也需要調用授權轉支付接口後纔會到商家的賬上),在用戶授權或支付後 支付寶那邊會調用咱們的異步接口(注意是用戶授權或支付後) 咱們接收到異步通知的信息來知道資金凍結是否成功。成功後就可以讓用戶使用商家的東西了。
第三步:調用授權轉支付接口-----將錢真正打到商戶賬上,這個接口一般來講是用戶在用完商戶的服務後,商戶進行收款。
其實真正的流程就是這三步,其他的接口比如退款/查詢/支付寶訂單信息同步 這些接口我就不寫了,都很簡單,直接按照文檔的示例寫就可以。下面就將前三步的代碼貼出
需要添加的引用:AopSdk
第一步:調用資金凍結接口
/// <summary>
/// 線上資金授權凍結接口
/// 功能:創建支付寶授權訂單並完成資金凍結。適用於線上場景完成資金授權, 例如從商戶APP端拉起支付寶收銀臺完成凍結。
/// 文檔: https://opendocs.alipay.com/open/20180417160701241302/vo4kv7/
/// https://opendocs.alipay.com/apis/api_28/alipay.fund.auth.order.app.freeze
/// </summary>
/// <returns></returns>
public string FreezeOnline()
{
string res=string.Empty;
//接收異步通知數據的地址
string notifyurl = "xxxxxxxxxxxx";
FreezeRequest req = new FreezeRequest()
{
out_order_no = "11111117788",
out_request_no = System.Guid.NewGuid().ToString("N"),
order_title = "test",
amount = 100.00,
product_code = "PRE_AUTH_ONLINE",
extra_param = "{\\\"category\\\":\\\"SCENIC_POSTPAY\\\",\\\"serviceId\\\":\\\"2020xxxxxxxxxxxxx\\\"}",
scene_code = "ONLINE_AUTH_COMMON_SCENE",
payee_logon_id = "xxxxxxxxx",
payee_user_id = "xxxxxxxxx"
};
try
{
IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", app_id, merchant_private_key, "json", "1.0", "RSA2", alipay_public_key, "GBK", false);
AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();
request.BizContent = "{" +
$"\"out_order_no\":\"{req.out_order_no}\"," +
$"\"out_request_no\":\"{req.out_request_no}\"," +
$"\"order_title\":\"{req.order_title}\"," +
$"\"amount\":\"{req.amount.ToString("f2")}\"," +
$"\"product_code\":\"{req.product_code}\"," +
$"\"payee_logon_id\":\"{req.payee_logon_id}\"," +
$"\"payee_user_id\":\"{req.payee_user_id}\"," +
"\"extra_param\":\"" + req.extra_param + "\"" +
"}";
request.SetNotifyUrl(notifyurl);
AlipayFundAuthOrderAppFreezeResponse response = client.SdkExecute<AlipayFundAuthOrderAppFreezeResponse>(request);
res = HttpUtility.UrlDecode(response.Body);
}
catch (Exception ex)
{
res = ex.ToString();
}
return res;
}
這個接口需要注意的是extra_param中的serviceId是必傳,而且調用的是client.SdkExecute(request);這個方法。之前調用client.Excute(request)一直返回錯誤。
第二步:將第一步的的response.Body直接返回給前端,前端收到後調起支付寶讓用戶授權/支付,接收回調數據
public void Notify(System.Web.HttpContext.Current.Request.Form paras)
{
try
{
//首先對接收到的數據進行驗籤 這裏沒寫這個邏輯 開發的時候要加上
string orderId = paras["out_order_no"];
//operation_type 【FREEZE--資金凍結回調,UNFREEZE,PAY】
string operation_type = paras["operation_type"];
//資金預授權明細的狀態 目前支持: INIT:初始 SUCCESS: 成功 CLOSED:關閉
string status = paras["status"];
//這個用戶的支付寶id要保存下,因爲授權轉支付的時候要用到
string payer_user_id = paras["payer_user_id"];
if (operation_type == "FREEZE")
{
if (status == "INIT")
{
}
if (status == "SUCCESS")
{
//授權成功
}
if (status == "CLOSED")
{
//授權關閉
}
}
}
catch (Exception ex)
{
return "error";
}
return "success";
}
第三步:調用授權轉支付接口
/// <summary>
/// 文檔:https://opendocs.alipay.com/apis/api_1/alipay.trade.orderinfo.sync
/// </summary>
/// <auth_code>支付授權碼</auth_code>
/// <subject>訂單標題</subject>
/// <returns></returns>
public string TradePay()
{
string res = string.Empty;
//接收異步通知的地址
string notifyurl = "xxxxxxxxxxxxxxx";
try
{
IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", app_id, merchant_private_key,
"json", "1.0", "RSA2", alipay_public_key, "GBK", false);
var tradePayReqParam = new
{
out_trade_no = "xxxxxxx", // 預授權轉支付商戶訂單號
//scene = "bar_code",
product_code = "PRE_AUTH_ONLINE",
auth_no = "xxxxxxxxxx",
subject = "test",
buyer_id = "xxxxxxxxxxxx",
seller_id = "xxxxxxxxxx",
total_amount = "100.00",
auth_confirm_mode = "COMPLETE"
};
AlipayTradePayRequest request = new AlipayTradePayRequest();
request.BizContent = "{" +
$"\"out_trade_no\":\"{tradePayReqParam.out_trade_no}\"," +
//$"\"scene\":\"{tradePayReqParam.scene}\"," +
$"\"auth_no\":\"{tradePayReqParam.auth_code}\"," +
$"\"subject\":\"{tradePayReqParam.subject}\"," +
$"\"product_code\":\"{tradePayReqParam.product_code}\"," +
$"\"buyer_id\":\"{tradePayReqParam.buyer_id}\"," +
$"\"seller_id\":\"{tradePayReqParam.seller_id}\"," +
$"\"total_amount\":\"{tradePayReqParam.total_amount}\"," +
$"\"auth_confirm_mode\":\"{tradePayReqParam.auth_confirm_mode}\"" +
" }";
request.SetNotifyUrl(notifyurl);
AlipayTradePayResponse response = client.Execute(request);
res = response.Body;
}
catch (Exception ex)
{
res = ex.Message;
}
return res;
}
第三步注意事項:文檔裏的auth_code字段要改成auth_no ,auth_no在資金凍結接口的異步通知裏取。product_code和buyer_id和seller_id是必傳字段,scene不需要傳。auth_confirm_mode字段必傳,具體傳什麼看文檔。這些都是坑。大家注意。
其他的接口和異步通知我就不寫了,大同小異。最後,給對接者一句話:先耐心詳細看文檔 遇到問題及時問客服