订单支付接口
注意-接口调试时候,请一定要注意环境和参数问题,需要区分:富友的测试环境和生产环境
描述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.0版本 | 必填 | 1.0.0 | 
| 银联签约订单号 | sign_order_id | MAX(30) | 银联签约的订单号,免密支付必填。其他不用填 | 非必填 | 51275121745 | 
| 页面跳转地址 | page_notify_url | MAX(200) | 支持:微信公众号,微企付H5,微企付小程序 | 非必填 | https://xxxxx.test.com/pages/index.jsp | 
| 分佣分账参数 | bill_params | MAX(512) | 传分佣分账信息 | 非必填 | 注意是JSON字符串,不是JSON对象。 | 
| 实名认证参数 | ext_user_info | MAX(256) | 支持:支付宝-数娱宝通道 | 非必填 | 格式:"{"need_check_info":"T","cert_no":"123456789","min_age":"18","name":"张三"}" | 
2.2 分佣分账参数格式说明如下
间连分佣业务,版本号ver传1.0.1 bill_params="{"allocate_amt":"分佣金额","contract_ssn":"分佣协议号"}"
直连分账业务,版本号ver传1.0.2 bill_params="[{"trans_in": "分账入账方编号", "amount": 分账金额,单位是分, "desc": "分账描述必填最多64位"}]"
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));
        });
      });
    });