订单支付接口
注意-接口调试时候,请一定要注意环境和参数问题,需要区分:富友的测试环境和生产环境
描述1
说明:富友的接口地址,区分:测试环境(test均为测试)或生产环境
描述2
富友的测试环境,会提供测试参数及测试秘钥
描述3
富友的生产环境,需要你们自己申请生产配置(详情请看,接口文档生产参数,按流程操作即可)
描述4
接口调试时候,请一定要看你们与富友之间接口的加解密流程(接口文档-接口概述-签名算法)
描述5
请求方式:HTTP POST BODY JSON提交(详情请看:案例代码/DEMO下载-如java请打开对应pos文件夹(支持JAVA,PHP,NODE))
1 请求地址
接口地址:[详情请咨询富友对接群-区分测试和生产地址(慎重)]
2 接口输入
变量名称 | 字段 | 长度 | 说明 | 是否可必填 | 样例 |
---|---|---|---|---|---|
商户代码 | mchnt_cd | MAX(15) | 商户在富友入网时生成的商户号 | 必填 | 0001000F0040992 |
报文体 | message | MAX | 报文体密文,详情请看(接口文档-接口概述-签名算法) | 必填 | OsxV9TKk5NzbD................ |
2.1 报文体
变量名称 | 字段 | 长度 | 说明 | 是否可必填 | 样例 |
---|---|---|---|---|---|
商户号码 | mchnt_cd | MAX(15) | 主商户号-收款,富友入网得到 | 必填 | 0001000F0040992 |
子商户号码 | sub_mchnt_cd | MAX(15) | 子商户号-收款或轮训用 | 非必填 | 0001000F0040992 |
订单日期 | order_date | MAX(8) | 订单日期,由对接商户系统产生,格式:YYYYMMDD | 必填 | 20221110 |
订单号 | order_id | MAX(30) | 订单号:由商户端生成,条件:唯一,数字和英文组合 | 必填 | 2023F1110551545151212 |
订单金额 | order_amt | MAX(12) | 订单金额:整数,单位:分 | 必填 | 10000(分)=100(元) |
支付方式 | order_pay_type | MAX(10) | 详情请看:产品概述-产品介绍 | 必填 | 比如:LETPAY-微信小程序 |
通知地址 | back_notify_url | MAX(200) | 订单支付成功,富友会根据此地址通知对接商户系统(POST) | 必填 | https://xxxxx.test.com/back.do |
商品名称 | goods_name | MAX(60) | 商品名称-大约15个中文 | 必填 | 比如:苹果手机 |
商品描述 | goods_detail | MAX(200) | 商品描述 | 必填 | 比如:买了一部苹果手机9000元 |
终端号 | term_id | MAX(8) | 终端号 | 非必填 | 一个终端设备对应一个终端号 |
微信APPID | appid | MAX(32) | 支付方式为:JSAPI或LETPAY 必填,其他非必填 | 非必填 | 微信公众号,微信小程序必填 |
用户OPENID | openid | MAX(128) | 支付方式为:JSAPI或LETPAY或FWC或ZKL 必填,其他非必填 | 非必填 | 微信公众号,微信小程序,支付宝小程序,吱口令 必填 |
超时时间 | order_timeout | MAX(4) | 按分钟计算,1-360,不传默认120分钟 | 非必填 | 比如:1(1分钟) |
花呗分期期数 | hbfq_num | MAX | 非必填。花呗分期期数3期6期12期 | 非必填 | 只能传3或者6或者12 |
版本号 | ver | MAX(5) | 版本控制,最新是1.0.1版本 | 必填 | 1.0.1 |
银联签约订单号 | sign_order_id | MAX(30) | 银联签约的订单号,免密支付必填。其他不用填 | 非必填 | 51275121745 |
页面跳转地址 | page_notify_url | MAX(200) | 支持:微信公众号,微企付H5,微企付小程序 | 非必填 | https://xxxxx.test.com/pages/index.jsp |
分佣参数 | bill_params | MAX(256) | 子商户号收款的钱,分佣给主商户号 | 非必填 | 格式:"{"allocate_amt":"分佣金额","contract_ssn":"分佣协议号"}" |
实名认证参数 | ext_user_info | MAX(256) | 支持:支付宝-数娱宝通道 | 非必填 | 格式:"{"need_check_info":"T","cert_no":"123456789","min_age":"18","name":"张三"}" |
3 接口输出
变量名称 | 字段 | 长度 | 说明 | 是否可必填 | 说明 |
---|---|---|---|---|---|
商户代码 | mchnt_cd | MAX(15) | 商户在富友入网时生成的商户号 | 必填 | 0001000F0040992 |
应答码 | resp_code | MAX(4) | 接口通讯应答码 | 必填 | 应答码不能当成订单状态码 |
应答描述 | resp_desc | MAX(200) | 应答描述 | 必填 | |
报文体 | message | MAX | 报文体(用商户私钥解密,得到明文JSON字符串) | 必填 | ADp7YzySKDrGI4UG6JcPwMVW3......... |
3.1 报文体
变量名称 | 字段 | 长度 | 说明 | 是否可必填 | 样例 |
---|---|---|---|---|---|
商户号码 | mchnt_cd | MAX(15) | 主商户号 | 必填 | |
订单日期 | order_date | MAX(8) | 订单日期 | 必填 | |
订单号 | order_id | MAX(30) | 商户订单号 | 必填 | |
订单金额 | order_amt | MAX(12) | 订单金额,单位:分 | 必填 | |
支付方式 | order_pay_type | MAX(10) | 支付方式 | 必填 | |
订单信息 | order_info | MAX | 详情请看3.2-3.5订单信息描述 | 必填 | 字符串 |
3.2 订单信息(order_info)公众号,小程序返回json字符串格式如下
# {"appId":"wxe2ae77d499999988","timeStamp":"1668466735","signType":"RSA","package":"prepay_id=wx150658551548026d616f3977fc8e8e0000","nonceStr":"40470c46c9fd42da9235ca3c3fd8dff5",
# "paySign":"an5et+twzDnueKq9hQucwf47lMxN4Ui1ZjTOCyrw/5JkIFKlWXFVZqEk9nGM1skIAiCFFISE/g5Zex0eu2Q7zA6vflKKxkMOSL25SwXtzAY+Qh/WHx6OiEQG6ZPkeyPYHVQLP0Vg+ckgbPRc2Oy9SA/FbdT98jxhV2AqY+
# pcAfkMsGpmzltb9Eqy9fP5tWbsNPMEHOwx1Hy861ZK9KfOkkUOKmGjYnglGiE4pPFrhPziehQsYMwL40bh1bMyCUxhQn32wUsczZXqzCB3/NjHQAeztRLCt2Ok0nGkkoA5kHFnfh77iIlrgupGIPyt/ieu2sKuKL/gml46JQzuMAhGRQ=="}
3.3微信小程序支付(支付方式是LETPAY)控件截图
微信官方文档API支付控件文档地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5
3.4商户跳转富友小程序支付[TAPPLET] 说明:下单接口返回order_info=32位字符串。就是一个token给前端跳转富友小程序自动拉起支付。
//1.先调后台接口下单。order_pay_type=TAPPLET (不用传appid和openid)
//2.返回order_info字段(就是一个32位字符串${token})。给前端跳转拉起支付。以下appid和path和小程序原始id联系富友获取。
//---------------H5浏览器客户端这样跳转支付---------------------------------
// t=621f1d71870f4a28557cea15a57da56f 从后台接口获取
$(document).ready(function() {
$(".btn").click(function() {
location.href = 'weixin://dl/business/?appid=wxe2ae77d4cbxxxxxx&path=pages/xxxxxx/xxxxxx&query=t=${token}';
});
});
//-------------------------小程序客户端这样跳转支付---------------------------------
// 如果要半屏打开的话, 要在你的微信后台开权限【设置-第三方设置-半屏小程序管理-添加, 输入对应的 appId】
// 建议此处添加节流判断,不然多次点击会连续打开,可能有非预期的 bug
wx.openEmbeddedMiniProgram({
appId: 'wxe2ae77d4cbxxxxxx',
path: `/pages/xxxxxx/xxxxxx?t=${token}`
})
// 支付结果在 app.js 的 onshow 中获取。通过 options.referrerInfo.extraData 获取支付结果
console.log(options.referrerInfo.extraData);
// 支付成功 输出 { code: 'success' } 取消 输出 { code: 'cancel' } 失败 输出 { code: 'fail', errmsg: '微信原生错误', errMsg: '微信原生错误' }
//--------------------------app客户端这样跳转支付-----------------------------------------------
//参考微信官方文档https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Launching_a_Mini_Program/Android_Development_example.html
String appId = "wxd930ea5d5axxxxxx"; // 填商户移动应用(App)的 AppId,非小程序的 AppID
IWXAPI api = WXAPIFactory.createWXAPI(context, appId);
WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
req.userName = "gh_b5b3eaxxxxxx"; // 填小程序原始id
req.path = "pages/xxxxx/xxxxx?t=${token}";
api.sendReq(req);
3.5微信公众号(支付方式是JSAPI)后台获取支付参数后。给前端这样拉起支付。
//微信公众号如下:
//参考微信官方文档https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml
function onBridgeReady(){+
WeixinJSBridge.invoke(
'getBrandWCPayRequest',{
"appId":"wxfa089da95020ba1a" ,
"timeStamp":"1721724593",
"nonceStr":"e17b540b65a74ca2802908447397cdb1",
"package":"prepay_id=wx23164953889663cb015139fe2c06210001",
"signType":"RSA",
"paySign":"MajaY6AEkVslEAcjsRaD3CUSyoiGB0Oyxs7qEL9eKVUKi6KNUSu0EOvYJhXECjEZ8Kj9ode9jsgOkTcCgknwj/Tn0eMZXAsgh+UCEfc04khlS+ph1xrovxPNw+Rod53ndXPtzraOrwRyZbT4EgRO/XWzqebi/bPejKGcXyEOiC9ZaHPhk/zZ+DFITLZMxsEA7tef7L27KTcpAhJFgVYS14VI2n2Ofhz/Z9bc5ae1USAsCmgqdpGuAykBPU4if3N8CMdg75cBU/9G2TzwZ5hAWKnj7teNpuJC+usoX2GUddLVyCsutbPvCiPKUZWJbKB8Fx5xbkuZV2gIwdPFfrukDQ=="
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 form到成功通知
//支付成功
}else if(res.err_msg == "get_brand_wcpay_request:cancel" ){
//用户取消支付
}else if(res.err_msg == "get_brand_wcpay_request:fail" ){
//支付失败
}
});
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
//支付宝生活号如下:
//参考支付宝官方文档https://opendocs.alipay.com/mini/05xhsr?pathHash=d4709298&ref=api
//引用src="https://a.alipayobjects.com/g/h5-lib/alipayjsapi/3.0.6/alipayjsapi.min.js">
function ready(callback) {
if (window.AlipayJSBridge) {
callback && callback();
} else {
document.addEventListener('AlipayJSBridgeReady', callback, false);
}
}
ready(function(){
document.querySelector('.tradeno').addEventListener('click', function() {
AlipayJSBridge.call("tradePay", {
tradeNO: "2024041822001456041435701645"
}, function(result) {
alert(JSON.stringify(result));
});
});
});