話說接支付寶的故事已經有幾個回合了,30年河東,30年河西,之前的支付寶已經不再是之前的支付寶啦,從技術上來講,變得越來越古怪了。接口都被當成產品,各種需要簽約啦。今天的重點在於支付寶網銀直連、轉賬到銀行卡兩個接口,故事的來來回回已經超越了技術層面,儼然成了一場非技術層面拉鋸。讀完本故事,您應該懂得怎麼開通支付寶網銀直連、轉賬到支付寶,故事寫於2019年9月29日下午16點46分。如果支付寶變來變去,故事也可能成爲歷史傳奇,不再有效。
一、捉摸不透的官方客服
向官方客服進行諮詢的話,先是機器人伺候,再到人工客服,統一都是說網銀直連下線了、轉賬到銀行卡下線了,無在線簽約入口。蹊蹺的是,在線客服提供可至電xxxx諮詢,聯繫業務經理云云。
二、線下業務經理的快速通道
原來被當成無解的支付寶網銀直連&轉賬到銀行卡,竟然在支付寶業務經理BD的線下郵件開通方式下,可以開通。這已經不再是技術領域的問題了。看接口路徑中的pre-open,文檔頂部標明瞭定向開放文檔。這些接口不簽約,統統是不生效了,參考文檔開發,也調不通。能走線下就不要去走線上,感覺線下就像一個綠色通道,無所不能。
2.1 支付寶網銀直連
網銀直連的文檔看起比較老舊,像是之前的支付寶對接文檔。demo也不難,不過,不簽約的話,照着demo做,也無法直接跳到網銀。官方提供的demo是java jsp版本,有點小小的不適應。
依據官方demo,轉了一份Spring MCV版本
@RequestMapping(value = "api")
public String api(Model model, HttpServletRequest request) throws Exception {
// 支付類型
String payment_type = "1";
// 必填,不能修改
// 服務器異步通知頁面路徑
String notify_url = "https://i.zuime.com/create_direct_pay_by_user-JAVA-UTF-8/notify_url.jsp";
// 需http://格式的完整路徑,不能加?id=123這類自定義參數
// 頁面跳轉同步通知頁面路徑
String return_url = "https://i.zuime.com/create_direct_pay_by_user-JAVA-UTF-8/return_url.jsp";
// 需http://格式的完整路徑,不能加?id=123這類自定義參數,不能寫成http://localhost/
// 商戶訂單號
String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 商戶網站訂單系統中唯一訂單號,必填
// 訂單名稱
String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"), "UTF-8");
// 必填
// 付款金額
String total_fee = new String(request.getParameter("WIDtotal_fee").getBytes("ISO-8859-1"), "UTF-8");
// 必填
// 訂單描述
String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"), "UTF-8");
// 默認支付方式
String paymethod = "bankPay";
// 必填
// 默認網銀
String defaultbank = new String(request.getParameter("WIDdefaultbank").getBytes("ISO-8859-1"), "UTF-8");
// 必填,銀行簡碼請參考接口技術文檔
// 商品展示地址
String show_url = new String(request.getParameter("WIDshow_url").getBytes("ISO-8859-1"), "UTF-8");
// 需以http://開頭的完整路徑,例如:http://www.商戶網址.com/myorder.html
// 防釣魚時間戳
String anti_phishing_key = "";
// 若要使用請調用類文件submit中的query_timestamp函數
// 客戶端的IP地址
String exter_invoke_ip = "";
// 非局域網的外網IP地址,如:221.0.0.1
//////////////////////////////////////////////////////////////////////////////////
// 把請求參數打包成數組
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("service", "create_direct_pay_by_user");
sParaTemp.put("partner", AlipayConfig.partner);
sParaTemp.put("seller_email", AlipayConfig.seller_email);
sParaTemp.put("_input_charset", AlipayConfig.input_charset);
sParaTemp.put("payment_type", payment_type);
sParaTemp.put("notify_url", notify_url);
sParaTemp.put("return_url", return_url);
sParaTemp.put("out_trade_no", out_trade_no);
sParaTemp.put("subject", subject);
sParaTemp.put("total_fee", total_fee);
sParaTemp.put("body", body);
sParaTemp.put("paymethod", paymethod);
sParaTemp.put("defaultbank", defaultbank);
sParaTemp.put("show_url", show_url);
sParaTemp.put("anti_phishing_key", anti_phishing_key);
sParaTemp.put("exter_invoke_ip", exter_invoke_ip);
// 建立請求
String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "確認");
model.addAttribute("page", sHtmlText);
return "pay/alipay/mapi/api";
重點參數在paymethod、defaultbank。
String paymethod = "bankPay";//網銀直連
String defaultbank= "CMB";//銀行簡碼,參考支付寶對接文檔詳細說明
PS:敲黑板畫重點,沒有簽約的話,是無法跳過去的,這些參數都不會生效,依舊會跳到支付寶的支付界面,而不是網銀。
2.2 轉賬到銀行卡
支付寶轉賬到銀行卡
https://docs.alipay.com/pre-open/api_pre/alipay.fund.trans.tobank.transfer
發起轉賬到銀行卡後,支付寶會返回很詳細的錯誤信息。
錯誤碼 | 錯誤描述 | 解決方案 |
---|---|---|
INVALID_PARAMETER | 參數有誤。 | 請根據入參說明檢查請求參數合法性。 |
SYSTEM_ERROR | 系統繁忙 | 可能發生了網絡或者系統異常,導致無法判定準確的轉賬結果。此時,商戶不能直接當做轉賬成功或者失敗處理,可以考慮採用相同的out_biz_no重發請求,或者通過調用“(alipay.fund.trans.order.query)”來查詢該筆轉賬訂單的最終狀態。 |
EXCEED_LIMIT_SM_AMOUNT | 單筆額度超限 | 請根據接入文檔檢查amount字段 |
EXCEED_LIMIT_DM_AMOUNT | 日累計額度超限 | 請根據接入文檔說明檢查本日請求總金額+本次請求金額是否超限。 |
EXCEED_LIMIT_MM_AMOUNT | 月累計金額超限 | 請根據接入文檔說明檢查本月請求總金額+本次請求金額是否超限。 |
PAYCARD_UNABLE_PAYMENT | 付款賬戶餘額支付功能不可用 | 請付款賬戶登錄支付寶賬戶開啓餘額支付功能。 |
PAYER_STATUS_ERROR | 付款賬號狀態異常 | 請檢查付款方是否進行了自助掛失,如果無,請聯繫支付寶客服檢查用戶狀態是否正常。 |
PAYER_CERTIFY_CHECK_FAIL | 付款方人行認證受限 | 付款方請升級認證等級。 |
PAYER_STATUS_ERROR | 付款方用戶狀態不正常 | 請檢查付款方是否進行了自助掛失,如果無,請聯繫支付寶客服檢查用戶狀態是否正常。 |
PAYER_BALANCE_NOT_ENOUGH | 付款方餘額不足 | 支付時間點付款方餘額不足,請向付款賬戶餘額充值後再原請求重試。 |
PAYER_USER_INFO_ERROR | 付款用戶姓名或其它信息不一致 | 檢查付款用戶姓名payer_real_name與真實姓名一致性。 |
PAYMENT_INFO_INCONSISTENCY | 兩次請求商戶單號一樣,但是參數不一致 | 如果想重試前一次的請求,請用原參數重試,如果重新發送,請更換單號。 |
CARD_BIN_ERROR | 收款人銀行賬號不正確 | 請確認收款人銀行賬號正確性,要求爲借記卡卡號。 |
PAYEE_CARD_INFO_ERROR | 收款方卡信息錯誤 | 請聯繫收款方確認卡號與姓名一致性。 |
INST_PAY_UNABLE | 資金流出能力不具備 | 可能由於銀行渠道在維護或無T0渠道,與聯繫支付寶客服確認。 |
PAYER_ACC_OCUPIED | 付款人登錄賬號存在多個重複賬戶,無法確認唯一 | 如果未傳輸payer_account_name,請傳入payer_account_name; 如果傳入了payer_account_name,則是由於登錄賬號對應的多個重複賬戶的真實姓名一致,請更換登錄號。 |
MEMO_REQUIRED_IN_TRANSFER_ERROR | 根據監管部門的要求,單筆轉賬金額達到50000元時,需要填寫付款理由 | 請填寫remark或memo字段。 |
PERMIT_CHECK_PERM_IDENTITY_THEFT | 您的賬戶存在身份冒用風險,請進行身份覈實解除限制 | 您的賬戶存在身份冒用風險,請進行身份覈實解除限制 |
依據官方提示,狀態可以通過alipay.fund.trans.order.query接口進行查詢覈實。而官方的接口描述,又給出了神奇的描述。
https://docs.open.alipay.com/api_28/alipay.fund.trans.order.query
* 轉賬單據狀態。
SUCCESS:成功(配合"單筆轉賬到銀行賬戶接口"產品使用時, 同一筆單據多次查詢有可能從成功變成退票狀態);
FAIL:失敗(具體失敗原因請參見error_code以及fail_reason返回值);
INIT:等待處理;
DEALING:處理中;
REFUND:退票(僅配合"單筆轉賬到銀行賬戶接口"產品使用時會涉及, 具體退票原因請參見fail_reason返回值);
UNKNOWN:狀態未知。
*/
@ApiField("status")
private String status;
經典問題
SUCCESS:成功(配合"單筆轉賬到銀行賬戶接口"產品使用時, 同一筆單據多次查詢有可能從成功變成退票狀態);
請告訴我,什麼時候才能一個轉賬的狀態能最終定下來
不能說多次查詢,又從成功變成了退票
請告之你們的轉賬到銀行卡狀態,在什麼時候才能明確的認定爲成功狀態,而不是有可能從成功狀態變成退票狀態
感覺接口死循環了。發起轉賬狀態要查詢,查詢狀態又可能從成功變成退款,很是尷尬的局面。支付寶客服一直未給一個明確的答覆,一個下午都在等答覆。
寫在收尾處
對接螞蟻金服支付寶的網銀直連、轉賬到銀行卡,不是一個技術問題,而商務簽約問題,不簽約,不給文檔,不給文檔沒有下文。對於技術人來講,收藏一份網銀直連、轉賬到銀行卡文檔,是很有必要的。估計簽名還沒有簽約,功能都可以提前開發好了。
讓天底下沒有難接的支付
關注公衆號【Yuema約嗎】回覆alipay,獲取支付網銀直連、轉賬到銀行卡技術文檔
ps:不簽約接口不生效,可以提前開發
首發地址:
http://www.jishudao.com/2019/09/29/alipay_bankpay_transfer2bankcard/