接入指引
一、用戶注冊登錄
用戶首先需完成 用戶注冊
已注冊商戶可以直接 商戶登錄
已注冊渠道可以直接 渠道登錄
1.引言
更新時間 |
更新內容 |
版本號 |
2017.11.1 |
新增退款接口 |
2.1.7 |
2018.1.15 |
修改了部分錯誤,修正了部分文字描述 |
2.1.8 |
1.1 文檔說明
一、訂單規范
本文件是i聚合為商戶接入i聚合支付平臺,提供的解決方案。
供內部開發人員或者與平臺服務方技術相關的人員參考使用。
文檔從交互模式,簽名,注意事項等方面對i聚合平臺的對接,做了相關的說明和工作模式。
1.2 閱讀對象
供商戶開發人員與商戶平臺服務方技術或業務人員參考和查詢。1.3 測試數據
測試公眾號的openid請關注“i聚合支付”發送openid,識別圖片獲得。
測試商戶號 |
測試秘鑰 |
公眾號APPID |
掃碼appid |
1635 |
0iUvmz8xXckxLD7NMFr9eXlBMvnYJNqo |
wx15100945b8d2b322 |
微信:1 |
1635 |
0iUvmz8xXckxLD7NMFr9eXlBMvnYJNqo |
wx15100945b8d2b322 |
支付寶: 2 |
1.4 支付流程

1.5 加密安全
平臺數據統一使用 md5_32進行初級加密,數據在i聚合平臺會進行二次加密并上傳相關通道,保證服務商戶數據在平臺的安全和數據的完整。2. 統一網關支付接口規范
2.1 網關地址
網關地址:https://ijuhepay.cn/GateWay/ReceiveOrder.aspx2.2上傳網關參數
參數 |
參數說明 |
參與簽名 |
類型 |
備注 |
P_UserId |
商戶ID |
是 |
整形數字 |
必須(由i聚合平臺提供) |
P_OrderId |
商戶訂單號 |
是 |
字符串,最長32位 |
必須,在商戶系統中保持唯一 |
P_CardId |
卡號 |
是 |
字符串,最長20位 |
1.代付請填寫出金銀行卡號???? ?2.微信wap請填寫應用類型 ?否則可為空 |
P_CardPass |
卡密 |
是 |
字符串,最長20位 |
卡類業務時必須,否則可為空 |
P_FaceValue |
面值 |
是 |
float,保留2位小數 |
必須(實際價格) |
P_Price |
代付金額 |
否 |
float,保留2位小數 |
必須,可傳0(價格標簽) |
P_FaceType |
幣種 |
是 |
字符串,最長3位 |
固定值CNY |
P_ChannelId |
支付類型 |
是 |
整型數字 |
必須(支付類型) |
P_Subject |
名稱 |
否 |
字符串,最常20位 |
代付請填寫用戶姓名??????否則可為空 |
P_Quantity |
產品數量 |
否 |
字符串,最長100位 |
必須?通常為“1” |
P_Description |
產品描述 |
否 |
字符串,最長100位 |
為方便查單,建議為空(此參數內容會顯示在支付憑證中) |
P_Notic |
用戶附加信息 |
否 |
字符串,最長50位 |
微信WAP請填寫應用名稱 |
P_Result_URL |
支付狀態通知地址 |
否 |
字符串,最長100位 |
必須異步通知地址 |
P_Notify_URL |
支付后網頁跳轉地址 |
否 |
字符串,最長100位 |
可為空(跳回)同步 |
P_PostKey |
簽名認證串 |
否 |
字符串 |
必須 |
P_APPID?????(或最終支付網址) |
申請提交的appid |
否 |
字符串,最長100位 |
必須(掃碼,wap用戶請填寫最終支付網址) |
P_OpenID |
openid |
否 |
字符串,最長128位 |
1.公眾號、APP對接時需要,為必填項???2.?微信WAP請填寫應用標識 |
2.3 提交網關驗簽說明
<!--
引入頭文件:
import
com.umf.api.service.UmfService
;
import
com.umf.api.service.UmfServiceImpl
;
-->
*************
調用示例
****************
//初始化UmfService類,傳入商戶號和商戶私鑰路徑
UmfService
instance
=
new
UmfServiceImpl
("60000100"
,"G:/60000100_.key.p8"
);
//增加商戶私鑰保存方法
Map
reqMap
=
prepareSaveCertMap
();
public
static
Map
prepareSaveCertMap(){
Map
reqMap
=
new
HashMap
();
reqMap
.
put
(
"60000102.mer.prikey.path"
,
"G:/60000102_.key.p8"
);
//傳入私鑰名(商戶號.mer.prikey.path)和路徑
return
reqMap
;
}
service.
addMerPrivateCertMap
(reqMap
);
/**
* 增加商戶私鑰保存方法
*/
public void test_addMerPrivateCertMap(){
UmfService service = new UmfService();
Hashtable ht = new Hashtable() {
{ "60000100",@"D:\cert\60000100_.key.der" }
};
service.addMerPrivateCertMap(ht);
}
import os
import umfpayservice
import umf_service_test
umfpayservice.umf_config.set_log_path('./logs')
umfpayservice.umf_config.add_private_keys([('60000100', 'G:/60000100_.key.pem'), ])
try:
umf_service_test.test_reconciliation_download()
except Exception as e:
print(e.message)
var umfUtil = require('../utils/UmfUtils')
var service = require('../service/umfService')
var testMer2Umf = new TestMer2Umf()
var umfService = new service()
var umfService1 = new service()
umfService.umfService("60000100", "G:/60000100_.key.pem")
umfService1.umfService("60000101", "G:/60000101_.key.pem")
//Go代碼示例
var (
mer_id, privateKey = "60000100", GetKey("D:/key/60000100_.key.pem")
//mer_id,privateKey ="60038402_", GetKey("D:/key/60038402_.key.pem")
)
//Ruby代碼示例
def test_addMerPrivateCertMap
UmfService.addMerPrivateCertMap("60000100","C:/60000100_.key.pem")
UmfService.addMerPrivateCertMap("60038402","C:/60038402_.key.pem")
puts $privateKeyPath
end
? 簽名認證postKey的生成:必須按照“參與簽名”狀態為“是”的參數按其順序用“|”組合,最后加上用戶密鑰,然后進行32位的md5編碼,如:P_PostKey=md5_32(P_UserId| P_OrderId| P_CardId| P_CardPass |P_FaceValue| P_FaceType| P_ChannelId|SalfStr)
SalfStr是您在設置信息的時候,填寫的安全碼(如何獲取安全碼?登錄商戶平臺,接口配置-->支付通道接口下載-->密鑰,這里自己設置安全密鑰)
? Result_URL必須填寫,而且是http://開頭的絕對網絡地址,否則支付成功后,您將得不到狀態地址。
? 接口提交示例:
https://ijuhepay.cn/GateWay/ReceiveOrder.aspx?P_UserId=2000&P_OrderId=90898089890we8r098erewr&P_CardId=S0989899809342343443&P_CardPass=908932849
&P_FaceValue=10.00&P_FaceType=CNY&P_ChannelId=3&P_Subject=MyPay&P_Price=10.00&P_Quantity
=1&P_Description=MyPay&P_Notic=sometext&P_PostKey=SDFS098KLJLKSJDFSKLJLKKLSF&P_AppID=
wxxxxxxxxxxxxx&P_Result_url=http://www.yousite.com/result.asp&P_Notify_URL=http://www.yousite.com/notify.asp
參考地址:http://blog.csdn.net/w938706428/article/details/45076003
3. 同步異步參數
支付狀態回調:用戶通過本平臺網關支付后,本平臺接收到支付報告狀態時,立即向您在提交網關參數中的P_Result_URL(支付狀態回調地址)傳遞支付報告,您根據這個支付報告的狀態,決定是否給用戶服務;
3.1 異步參數規范
參數 |
參數說明 |
參與簽名 |
類型 |
備注 |
P_UserId |
商戶ID |
是 |
整型數字 |
商戶在平臺的商戶號 |
P_OrderId |
商戶訂單號 |
是 |
字符串,最長32位 |
商戶自己定義的訂單號 |
P_CardId |
卡類充值時的卡號 |
是 |
字符串,最長20位 |
返回上傳的值 |
P_CardPass |
卡類充值時的卡密 |
是 |
字符串,最長20位 |
返回上傳的值 |
P_FaceValue |
面值 |
是 |
float,保留2位小數 |
返回上傳的值 |
P_ChannelId |
支付銀行類型 |
是 |
字符串 |
銀行返回 |
P_OrderId_out |
平臺訂單號 |
是 |
字符串,最長32位 |
平臺返回平臺訂單號 |
P_PayMoney |
充值的產品金額 |
否 |
float,保留2位小數 |
返回上傳的值 |
P_Subject |
產品名稱 |
否 |
字符串,最常20位 |
返回上傳的值 |
P_Price |
產品價格 |
否 |
float,保留2位小數 |
返回上傳的值 |
P_Quantity |
產品數量 |
否 |
整型數字 |
返回上傳的值 |
P_Descripton |
產品描述 |
否 |
字符串,最常100位 |
返回上傳的值 |
P_Notic |
用戶附加信息 |
否 |
字符串,最常50位 |
返回上傳的值 |
P_ErrCode |
錯誤代碼 |
否 |
整型數字 |
返回信息(信息代碼詳見附錄) |
P_ErrMsg |
錯誤描述 |
否 |
字符串 |
報錯信息描述 |
P_PostKey |
簽名認證串 |
否 |
字符串 |
Md5加密簽 |
3.2 回調驗簽說明
//java代碼示例
public static void runOneQuickPayGetSMSDemo(){
//模擬一鍵支付獲取短信請求參數
Map reqMap = prepareGetSmsMap();
Map respMap = MerCallServiceSingleton.getInstancei().getSMSMap(reqMap);
printResult(respMap);
}
//一鍵支付獲取短信請求參數
public static Map prepareGetSmsMap(){
Map reqMap = new HashMap();
reqMap.put("mer_id",mer_id);
reqMap.put("trade_no","3801261003248915");
reqMap.put("media_id","13333333333");
reqMap.put("amount","1");
return reqMap;
}
? 簽名認證postKey的生成:必須按照“參與簽名”狀態為“是”的參數按其順序用“|”組合,最后加上用戶密鑰,然后進行32位的md5編碼,比如:P_PostKey=md5_32(P_UserId| P_OrderId| P_CardId| P_CardPass| P_FaceValue| P_ChannelId| P_OrderId_out |SalfStr),
SalfStr是商戶后臺的秘鑰,填寫的秘鑰。
? P_ErrCode=0表示支付成功。
? 通過后臺接收返回時,接收到數據后,請返回errCode=0,不要其它任何字符及html代碼。
? 回調參數以key=value的形式下發給客戶。
? 在對接的時候,接收到異步通知,驗簽成功后在修改訂單狀態,防止惡意刷單。
3.3 同步參數列表
參數 |
參數說明 |
參與簽名 |
類型 |
備注 |
P_UserId |
商戶ID |
是 |
整型數字 |
商戶在平臺的商戶號 |
P_OrderId |
商戶訂單號 |
是 |
字符串,最長32位 |
返回上傳的值 |
P_FaceValue |
面值 |
是 |
float,保留2位小數 |
返回上傳的值 |
P_ChannelId |
支付銀行類型 |
是 |
字符串 |
返回上傳的值 |
P_OrderId_out |
平臺訂單號 |
是 |
字符串,最長32位 |
平臺返回平臺訂單號 |
P_PayMoney |
充值的產品金額 |
否 |
float,保留2位小數 |
返回上傳的值 |
P_Subject |
產品名稱 |
否 |
字符串,最常20位 |
返回上傳的值 |
4 補單機制
補單,是指訂單實際已經支付成功,但是由于各方面原因,系統沒有收到訂單成功返回或返回超時,i聚合平臺判定失敗并下發通知,在訂單狀態顯示失敗。因為此訂單是成功訂單,不影響商戶資金結算。i聚合平臺管理員,
確認此單真實有效后,可將該訂單由失敗狀態修改為成功狀態并重新下發,即補單。
5. 附錄
5.1 錯誤代碼
錯誤碼 |
錯誤原因 |
0 |
提交或者是支付成功 |
-1 |
微信簽名或包名錯誤,appid未注冊等原因 |
-2 |
用戶取消支付 |
處理失敗2 |
鏈接通道失敗,檢查appid,秘鑰等原因 |
非法子商戶號 |
一般為appid沒成功綁定或綁定出現問題 |
sub_mch_id與sub_appid不匹配 |
可能appid未完成微信認證 |
110|加密串postKey錯誤 |
加密錯誤,請嚴格按照加密樣式進行加密 |
受理機構必須傳入sub_mch_id |
受理機構傳入值錯誤(一般為銀行方面問題) |
未創建應用或應用未開通 |
請檢查是否綁定了應用或者開通了商戶號,或者相關數據是否正確 |
113 |
未開通此通道或者業務 |
199 |
同步跳轉 |
5.2 支付類型
1000 |
掃碼支付 |
1010 |
微信APP |
1020 |
微信公眾號 |
1030 |
手機網頁 |
6. 對接詳情
6.1 公眾號
6.1.1 公眾號demo體驗
請關注:i聚合 或者 i聚合支付(微信號:ijuhe-pay),或者掃一掃下面二維碼,進入公眾號內,點擊支付體驗菜單進行測試
6.1.2 開發
商戶在自己微信公眾號H5商城中,集成微信支付功能。用戶通過關注公眾號,使用公眾號完成下單支付的流程。6.1.3 提交參數見網關規范
Appid為申請支付時提交的appid。Openid需客戶根據官方文檔自行獲取。參考文檔連接:https://pay.weixin.qq.com/wiki/doc/api/index.html
參考文檔連接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
按照文檔上傳后平臺會返回如下參數:
https://ijuhepay.cn/GateWay/ReceiveOrder.aspx?P_UserId=1635&P_OrderId=i20170526100341170305&P_CardId=&P_CardPass=&P_FaceValue=0.01&P_ChannelId=1000&P_Subject=GamePay&P_Price=1&P_Quantit
y=1&P_Description=GamePay&P_Notic=parmas&P_AppID=wx15100945b8d2b322&P_Result_url=異步通知地址&P_Notify_url=成功跳轉地址&P_PostKey=d30b4411040788815e260528562362f4&P_OpenID=獲取到的openid
商戶接收支付鏈接然后跳轉這個地址就可以調起支付頁。
也可返回json,商戶根據官方文檔自行調起支付https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_7&index=6。
6.2掃碼支付
掃碼提交參數以及加密方式見統一網關規范唯一網址請填寫支付申請的唯一網址,否則系統無法判斷您的業務。
提交成功后系統直接返回二維碼頁面或者字符串
6.3 微信app支付
提交參數以及加密方式請參考統一網關規范
上傳參數后平臺會下一個json
{"appid":"商戶提交審核上傳的Appid","partnerid":"31531796","prepayid":"wx20170623100942872d3c50c80912354355","timestamp":"1498183782","noncestr":"201706231009421498183782493285","package":"Sign=WXPay","sign":"3D15F4FA3E7B49A1B1CBD34F7623F648"}
商戶根據下發的json自行調起支付 參考文檔:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_7&index=6
Sdk :
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
6.4 WAP支付
6.4.1 QQWAP支付
參照掃碼支付提交參數后平臺會返回支付調起連接 示例如下:
https://myun.tenpay.com/mqq/pay/index.shtml?t=5V25dd4d61fafc95ad4240a8cd8be6d8
打開這個支付既調起支付
6.4.2 微信WAP支付
由于微信wap比較特殊,需要上傳需要上傳應用類型,應用名稱,應用標識等。
詳情如下:
1.應用類型:
如果是用于蘋果 app 應用里值為 iOS_SDK;如 果是用于安卓 app 應用里值為 AND_SDK;如果 是用于手機網站,值為 iOS_WAP 或 AND_WAP 均可。
2.應用名稱:
WAP請填寫應用名如果是用于蘋果或安卓 app 應用中,傳分別 對應在 AppStore 和安桌分發市場中的應用名 (如:王者榮耀)
3.應用標識:
WAP時請填寫應用標識 (蘋果傳 IOS 應 用 唯 一 標 識 ( 如 : com.tencent.wzryIOS) 安卓傳包名(如:com.tencent.tmgp.sgame) 如果是用于手機網站,傳網站首頁 URL 地址, 必 須 保 證 公 網 能 正 常 訪 問 ( 如 : https://m.jd.com))
返回參數如下:
ttps://statecheck.swiftpass.cn/pay/wappay?token_id=29d0a92af3bdbbde57b18bb3b42801cc8&service=pay.weixin.wappayv2
7.訂單狀態查詢
WAP時請填寫應用標識 (蘋果傳 IOS 應 用 唯 一 標 識 ( 如 : com.tencent.wzryIOS) 安卓傳包名(如:com.tencent.tmgp.sgame) 如果是用于手機網站,傳網站首頁 URL 地址, 必 須 保 證 公 網 能 正 常 訪 問 ( 如 : https://m.jd.com))
訂單查詢接口提交參數:
參數名稱 |
參數名稱 |
是否必填 |
參數長度 |
參數說明 |
p0_Cmd |
業務類型 |
是 |
20 |
固定值“QueryOrdDetail” |
p1_MerId |
商戶編號 |
是 |
11 |
商戶在平臺的商戶號 |
p2_Order |
商戶訂單號 |
是 |
50 |
商戶平臺的訂單號 |
Md5 |
|
|
加密后的數據 |
數據加密:hmac=p0_Cmd+p1_MerId+p2_Order+商戶秘鑰
加密示例:
加密前:
QueryOrdDetail1635i20170731042858209869pSHPKEKeYpR8UwKzG2mB6tphO3AEtwSy
加密后:
加密前:
提交參數示例:
https://ijuhepay.cn/GateWay/ReceiveOrderSelect.aspx?p0_Cmd=QueryOrdDetail&p1_MerId=1635&p2_Order=i20170731042858209869&hmac=e9a1c4effbc5b5bae4d139e41eb7cf70
平臺返回參數如下:
參數名稱 |
參數名稱 |
參數長度 |
參數說明 |
r0_Cmd |
支付結果 |
|
固定值“QueryOrdDetail” |
r1_Code |
平臺交易號 |
50 |
“1”, 代表支付成功. |
r2_TrxId |
交易流水號 |
50 |
平臺產生的交易流水號,每筆訂單唯一 |
r3_Amt |
支付金額 |
20 |
單位:元,精確到分. 商戶收到該返回數據后,一定用自己數據庫中存儲的金額與該金額進行比較 |
r4_Cur |
交易幣種 |
10 |
返回時是“RMB” |
r5_Pid |
商品名稱 |
20 |
返回商戶設置的商品名稱. |
r6_Order |
商戶訂單號 |
50 |
返回商戶訂單號 |
r8_MP |
商戶擴展信息 |
20 |
此參數如用到中文,請注意轉碼 |
rb_PayStatus |
支付狀態 |
10 |
為“SUCCESS”: 支付成功; |
MD5 |
|
加密后的值 |
加密參數示例:
加密前:
md5=QueryOrdDetail+r1_Code+r2_TrxId+r3_Amt+?r4_Cur+r5_Pid+r6_Order+?r8_MP+rb_PayStatus+商戶秘鑰
加密前:
hmac=e831ed1dffde5d4ae5d2e571b13cdc3b
平臺返回json如下::
{"r0_Cmd":"QueryOrdDetail","r1_Code":"1","r2_TrxId":"201707311628589355","r3_Amt":"0.10","r4_Cur":"RMB","r5_Pid":"","r6_Order":"i20170731042858209869","r8_MP":"","rb_PayStatus":"SUCCESS","hmac":"e831ed1dffde5d4ae5d2e571b13cdc3b"}
8.退款接口
請求地址:https://ijuhepay.cn/GateWay/ReceiveOrderRefund.asp
請求參數如下:
參數名稱 |
參數名稱 |
是否必填 |
參數長度 |
參數說明 |
p0_Cmd |
業務類型 |
是 |
20 |
固定值“RefundOrdDetail” |
p1_MerchantId |
商戶編號 |
是 |
11 |
商戶在平臺的商戶號 |
p2_UsrOrderId |
商戶訂單號 |
是 |
50 |
要退款的商戶平臺的訂單號 |
MD5 |
|
|
加密后的數據 |
數據加密:hmac=p0_Cmd+p1_MerchantId+p2_UsrOrderId+商戶秘鑰
加密示例:
加密前:
RefundOrdDetail1635i201711020209571170550iUvmz8xXckxLD7NMFr9eXlBMvnYJNqo
加密后:
cc65c6da74969545839309e2e65511b9
提交連接示例
_MerchantId=1635&p2_UsrOrderId=i20171102020957117055&hmac=cc65c6da74969545839309e2e65511b9
返回參數
參數名稱 |
參數名稱 |
參數長度 |
參數說明 |
r0_Cmd |
業務類型 |
_____ |
固定值“RefundOrdDetail” |
r1_Code |
提交結果 |
50 |
“success”, 代表退款申請成功. |
r2_OrderId |
交易流水號 |
50 |
平臺產生的交易流水號,每筆訂單唯一 |
r3_Money |
支付金額 |
20 |
單位:元,精確到分. 商戶收到該返回數據后,一定用自己數據庫中存儲的金額與該金額進行比較 |
r4_PayType |
交易幣種 |
10 |
返回時是“RMB” |
r6_UsrOrderId |
商戶訂單號 |
50 |
返回商戶訂單號 |
r7_Msg |
返回信息 |
20 |
提交信息(不參與簽名) |
MD5 |
|
加密后的值 |
返回結果示例
{"r0_Cmd":"RefundOrdDetail","r1_Code":"success","r2_OrderId":"201711021409569421","r3_Money":"0.01","r4_PayType":"RMB","r6_UsrOrderId":"i20171102020957117055","r7_Msg":"提交退款申請成功,請查看處理結果!","hmac":"ba1764bb3ac7a1eb5efc94f348ff93a5"}
9. 注意事項
- 1:公眾號支付官方提示在支付前最好做微信版本的判斷,詳情請參考官方文檔。
- 2:商戶調試想看訂單回調,請登錄商戶后臺,在成功訂單找到要查看的訂單,點擊“通知”查看。
- 3:掃碼后自動跳轉到上傳的P_Notify_URL網址,不附帶任何參數。
- 4:App 支付返回302,但是網頁打開返回json,一般是程序當中把允許重定向關閉了。
- 5:加密請嚴格按照文檔參數上傳,否則容易出現加密錯誤。
- 6:請求參數是為get,異步為get。
- 7:i聚合平臺為商戶提供了兩種返回模式,第一種:返回平臺默認的頁面,商戶直接支付即可,
- 頁面由平臺統一提供。第二種:平臺返回相應的字符串,商戶自行調起支付。