接入指引
一、用户注册登录
用户首先需完成 用户注册
已注册商户可以直接 商户登录
已注册渠道可以直接 渠道登录
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聚合平台为商户提供了两种返回模式,第一种:返回平台默认的页面,商户直接支付即可,
- 页面由平台统一提供。第二种:平台返回相应的字符串,商户自行调起支付。