微信支付宝类接口

自2019年5月5日起上线的新商户,完成入驻后商户需继续完成微信官方实名认证后才能进行交易,请参考 商户实名认证指引 完成实名认证。

pay012 APP支付

功能说明

适用产品企账通/app+,支付宝正扫,银联正扫,微信公众号,支付宝小程序/生活号,微信小程序,微信正扫直连,微信app支付直连,银联app支付,apple支付,微信H5支付直连,支付宝app支付(直连)。

注意项:商户在接入微信直连app支付并且属于商户直连模式(service_mode=2)时,接口同步返回的参数pay_info无法正常唤起微信app,需要商户根据微信官方v2版本接口文档(https://pay.weixin.qq.com/wiki/doc/api/app/app_sl.php?chapter=9_12&index=2)组织参数加签才能唤起微信app进行支付。

调用方式:后台返回(同步,异步)

微信 APP 支付业务流程说明:

_images/wx_app_flow.jpg

微信公众号支付业务流程说明:

_images/wx_js_flow.jpg

支付宝小程序/生活号业务流程说明:

_images/ali_flow.jpg

调用地址:

请求参数

参数中文名称 参数名称 数据格式 是否必须 说明
版本号 version 定长2位String 必须 目前固定为10
商户客户号 mer_cust_id 定长16位String 必须 由汇付生成,商户的唯一性标识 出账方商户客户号
订单号 order_id 变长50位String 必须  
订单日期 order_date 定长8位String 必须  
用户客户号 user_cust_id 定长16位String 可选  
支付类型 app_pay_type 变长2位String 必须 01:微信正扫 02:支付宝正扫 03:银联正扫 05:微信公众号 06:支付宝小程序/生活号 07:微信小程序 08:微信正扫(直连) 09:微信app支付(直连) 10:银联app支付 11:apple支付 12:微信H5支付(直连) 13:支付宝app支付(直连) 14:聚分期
扫码模式 scan_mode 定长1位String 可选 不填:通用 1:线上 2:线下 3:线上停车场 注:通用模式不等于线上线下模式 只有微信正扫、微信app支付、微信公众号支付、小程序支付、微信正扫(直连)、微信app支付(直连)、微信H5支付(直连)才区分通用/线上/线下
延时分账 div_type 定长1位String 可选 0:实时分账 1:延时分账 注:延时分账时,in_cust_id、in_acct_id、div_details必须为空
支付类型 biz_trans_type 定长1位String 可选 P:支付 R:充值 默认支付 P
入账客户号 in_cust_id 定长16位String 可选 in_cust_id,in_acct_id和div_details二选一; 不分账时,可直接填写in_cust_id,in_acct_id
入账账户号 in_acct_id 变长9位String 可选 in_cust_id,in_acct_id和div_details二选一; 不分账时,可直接填写in_cust_id,in_acct_id
分账串 div_details 变长String 可选 in_cust_id,in_acct_id和div_details二选一
交易金额 trans_amt 变长14位String 必须 泛指交易金额,金额格式必须是###.00,比如2.00,2.01
手续费客户号 fee_cust_id 定长16位String 可选 用于指定手续费收取客户号
手续费账户号 fee_acct_id 变长9位String 可选 用于指定手续费收取账户号 传手续费客户号时必填,必须是属于手续费客户号下的账户号
禁用贷记卡 limit_pay 定长1位的String 可选 1为禁用,否则可不填
买家用户ID buyer_id 变长100位String 可选 支付宝统一下单时必填;微信公众号支付、微信小程序支付时: 联调环境下传空 生产环境下不能为空
APPID app_id 变长32位String 可选 商户在微信申请的APPID 支付类型为微信APP支付、微信公众号支付、微信小程序支付、银联app支付、apple支付时不能为空 ;
商品标记 goods_tag 变长32位String 可选 微信公众号、小程序使用
是否原生态 is_raw 定长1位String 可选 微信公众号、小程序使用 0:否 1:是 不填则默认1
附加信息 attach_info 变长128位String 可选 微信公众号支付的参数
商品描述 goods_desc 变长127位String 必填  
商品类型 goods_type 定长4位String 可选 MCC 银联正扫和银联app不传此参数
订单超时时间 order_expire_time 定长14位String 可选 格式为 yyyyMMddHHmmss
支付返回地址 ret_url 变长128位的String 可选 微信公众号支付时,必须输入 用于微信支付成功后跳转的页面; 支付宝统一下单时,必须输入; 微信小程序时,必须输入
商户后台应答地址 bg_ret_url 变长128位String 可选 通过后台异步通知,商户应在应答接收的响应中输出RECV_ORD_ID字样的字符串,表明商户已经收到该笔交易结果。 注意: 1) URL中请不要包含特殊字符 2) 必须是外网地址
设备静态信息 dev_info_json 变长2000位String 必填 json格式如:{“ipAddr”:”10.99.195.11”,”devType”:”2”,”MAC”:”D4-81-D7-F0-42-F8”,”IMEI”:”3553200846666033”};注:ipAddr和devType必填,MAC和IMEI 二选一必填,见下文
场景信息 scene_info 变长256位String 可选 微信H5支付(直连)时必填json串,详细案例见后续说明
服务商渠道号 channel_code 变长20位String 可选 服务商模式必传
商户私有域 mer_priv 变长120位String 可选  
扩展域 extension 变长512位String 可选 聚分期场景需要上送字段示例:{“serviceFeeRecType”:”M”,”limitBankId”:”03080000”,”limitNum”:”3”,”frontUrl”:”https://www.baidu.com”}
服务商模式标记 service_mode 定长1位String 可选 1:服务商模式 2:商户直连模式 当app_pay_type=08、09、12时必填
微信支付子商户号 mch_id 变长32位String 可选 当app_pay_type=08、09、12时必填,与appId一一对应
交易发生地 transaction_addr 定长64位String 必填 例如:上海
用途 purpose 定长256位String 必填 例如:其他
对手方ip user_ip_addr 定长20位String 必填 用户终端ip

分账串格式: 注:分账串最大支持5个

参数中文名称 参数名称 数据格式 是否必须 说明
分账客户号 divCustId 定长16位String 必须  
分账账户号 divAcctId 定长9位String 必须  
分账金额 divAmt 变长14位String 必须 泛指交易金额,金额格式必须是###.00,比如2.00,2.01
scene_info:
1,IOS移动应用
{"h5_info": //h5支付固定传"h5_info"
        {"type": "",  //场景类型,固定IOS
         "app_name": "",  //应用名
         "bundle_id": ""  //bundle_id
         }
}
案例:
{"h5_info": {"type":"IOS","app_name": "王者荣耀","bundle_id": "com.tencent.wzryIOS"}}

2,安卓移动应用
{"h5_info": //h5支付固定传"h5_info"
        {"type": "",  //场景类型,固定Android
         "app_name": "",  //应用名
         "package_name": ""  //包名
         }
}
案例:
{"h5_info": {"type":"Android","app_name": "王者荣耀","package_name": "com.tencent.tmgp.sgame"}}

3,WAP网站应用
{"h5_info": //h5支付固定传"h5_info"
   {"type": "",  //场景类型,固定Wap
        "wap_url": "",//WAP网站URL地址
        "wap_name": ""  //WAP 网站名
        }
}
案例:
{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "腾讯充值"}}

设备信息:

字段 字段描述 是否必须
devType 设备类型 1.电脑;2.手机 必填
ipAddr IP地址 必填
MAC MAC地址 选填
IMEI IMEI码 选填
devSysType 设备系统类型 1.IOS;2.安卓;3.windows 选填
UUID UUID 选填
IMSI IMSI码 选填
ICCID ICCID码 选填
MEID MEID码 选填
SEID SEID 选填
ipType IP地址类型代理、家庭、办公环境、网吧、学校等,直接给中文名称 选填
ipProvName IP省 选填
ipCityName IP市 选填
ipAreaName IP地区 选填
ipProvCode IP省编码 选填
ipCityCode IP市编码 选填
ipAreaCode IP地区编码 选填
cenX 定位(经度) 选填
cenY 定位(纬度) 选填
provName 定位地址(省) 选填
cityName 定位地址(市) 选填
areaName 定位地址(区) 选填
provCode 定位(省编码) 选填
cityCode 定位(市编码) 选填
areaCode 定位(区编码) 选填
unDevCode 用户交易设备(唯一识别码) 选填
serviceProviderIp 商户服务IP地址 选填
merUrl 商户网址 选填

返回参数

参数中文名称 参数名称 数据格式 是否必须 说明
应答返回码 resp_code 定长6位String 必须  
应答返回描述 resp_desc 变长String 必须 返回码的对应中文描述
银行返回码 bg_bank_code 变长32位String 可选  
银行返回描述 bg_bank_desc 变长200位String 可选  
商户客户号 mer_cust_id 定长16位String 必须 由汇付生成,商户的唯一性标识 出账方商户客户号
订单号 order_id 变长50位String 必须  
订单日期 order_date 定长8位String 必须  
本平台交易唯一标识号 platform_seq_id 变长20位String 可选  
外部订单流水号 out_trans_id 变长64位String 可选 外部订单流水号,指支付宝、微信、银联流水号
微信订单号 party_order_id 变长64位String 可选 微信订单号
用户客户号 user_cust_id 定长16位String 可选  
支付类型 app_pay_type 变长2位String 必须 01:微信正扫 02:支付宝正扫 03:银联正扫 04:微信APP支付 05:微信公众号支付 06:支付宝统一下单 07:小程序支付 08:微信正扫(直连) 09:微信app支付(直连) 10:银联app支付 11:apple支付 12:微信H5支付(直连) 13:支付宝app支付(直连)
入账客户号 in_cust_id 定长16位String 可选  
入账账户号 in_acct_id 变长9位String 可选  
分账类型 div_type 定长1位String 可选  
分账账户串 div_details 变长String 可选  
交易金额 trans_amt 变长14位String 必须 泛指交易金额,金额格式必须是###.00,比如2.00,2.01
手续费客户号 fee_cust_id 定长16位String 可选  
手续费账户号 fee_acct_id 变长9位String 可选  
手续费金额 fee_amt 变长14位String 可选  
手续费内外扣 fee_flag 定长1位String 可选 O=外扣,I=内扣
手续费内外扣 fee_flag 定长1位String 可选 O=外扣,I=内扣
分期服务费 service_fee 变长14位String 可选  
APPID app_id 变长32位String 可选  
商品标记 goods_tag 变长32位String 可选  
是否原生态 is_raw 定长1位String 可选  
附加信息 attach_info 变长128位String 可选 微信公众号支付的参数
商品描述 goods_desc 变长127位String 必填  
商品类型 goods_type 定长4位String 可选 银联MCC 银联时不填则默认取商户信息中的
订单超时时间 order_expire_time 定长14位String 可选 格式为 yyyyMMddHHmmss
支付返回地址 ret_url 变长128位String 可选  
商户后台应答地址 bg_ret_url 变长128位String 可选  
设备信息 dev_info_json 变长1024位String 必填  
可分账金额 real_trans_amt 变长14位String 可选 延迟分账用,订单交易成功时有效; 该字段配合“延时分账确认”接口的“非手续费分摊模式” 使用,如果“延时分账确认”接口中字段share_fee_mode=1(手续费分摊模式),则忽略字段real_trans_amt
商户私有域 mer_priv 变长120位String 可选  
扩展域 extension 变长512位String 可选  
支付地址 pay_url 变长64位String 可选 同步返
动态口令 token_id 变长64位String 可选 同步返
支付信息 pay_info 变长String 可选 同步返
  • pay_info格式:
1. 微信app支付(04):
例: {"appId":"wx37a0656x728dd2e4","partnerId":"1370813721","prepayId":"wx2738495723037206ba28374920381620","package":"Sign=WXPay","timeStamp":"1370813721","nonceStr":"32285e23231a54181a4ed24191acda38","paySign":"nADFvP4pHXFSvxCI9sOoCGieux17XXb6tuJhAzWgir628CYJDAE2gWJvSUD07/UcZfswMMfIGmm3frHiGF286xNcRgQ/bKQ9F2J/2jjlqd8N7SiDZqEYRYeX+Hh7mRKjsUsaoIKlsWKSgQm/2vwuGTXmYu6fPavpTnTPscRqJ/Byo92lVHzjTiJzeYbo79Svw8MtjI2DiuPjvv2VP9lXg1OoiqohMJ1DJTeR8ZnUBTfr3N0d1fSDYj1+BpNacpoKzYHltL4d4KXAfXt+/RcJpdybrxMSK6zjkJeg7E/581NB9XY2RPuXWof5UMj/q6g=="}

2. 微信公众号支付(05):
例: {"appId":"wx37a0656x728dd2e4","timeStamp":"1370813721","nonceStr":"32285e23231a54181a4ed24191acda38","package":"prepay_id=wx2738495723037206ba28374920381620","signType":"RSA","paySign":"nADFvP4pHXFSvxCI9sOoCGieux17XXb6tuJhAzWgir628CYJDAE2gWJvSUD07/UcZfswMMfIGmm3frHiGF286xNcRgQ/bKQ9F2J/2jjlqd8N7SiDZqEYRYeX+Hh7mRKjsUsaoIKlsWKSgQm/2vwuGTXmYu6fPavpTnTPscRqJ/Byo92lVHzjTiJzeYbo79Svw8MtjI2DiuPjvv2VP9lXg1OoiqohMJ1DJTeR8ZnUBTfr3N0d1fSDYj1+BpNacpoKzYHltL4d4KXAfXt+/RcJpdybrxMSK6zjkJeg7E/581NB9XY2RPuXWof5UMj/q6g=="}

3. 小程序支付(07):
例: {"appId":"wx37a0656x728dd2e4","timeStamp":"1370813721","nonceStr":"32285e23231a54181a4ed24191acda38","package":"prepay_id=wx2738495723037206ba28374920381620","signType":"RSA","paySign":"nADFvP4pHXFSvxCI9sOoCGieux17XXb6tuJhAzWgir628CYJDAE2gWJvSUD07/UcZfswMMfIGmm3frHiGF286xNcRgQ/bKQ9F2J/2jjlqd8N7SiDZqEYRYeX+Hh7mRKjsUsaoIKlsWKSgQm/2vwuGTXmYu6fPavpTnTPscRqJ/Byo92lVHzjTiJzeYbo79Svw8MtjI2DiuPjvv2VP9lXg1OoiqohMJ1DJTeR8ZnUBTfr3N0d1fSDYj1+BpNacpoKzYHltL4d4KXAfXt+/RcJpdybrxMSK6zjkJeg7E/581NB9XY2RPuXWof5UMj/q6g=="}

4. 微信app支付(直连)(09)
例: {"package":"Sign=WXPay","appid":"wx37a0656x728dd2e4","sign":"27362E2B9382618C3E273F95BCAA8F4D","partnerid":"28371829912","prepayid":"wx2738495723037206ba28374920381620","noncestr":"32285e23231a54181a4ed24191acda38","timestamp":"1370813721"}

5. 支付宝统一下单(06)
例: {"tradeNO":"2020010112345617263849205817"}

6. 支付宝app支付(直连)(13)
例: alipay_sdk=alipay-sdk-java-3.3.49.ALL&app_id=20210123762837621&biz_content=%7B%22app_auth_token%22%3A%22202003BB34fce03a19174c3cb5ea9aca23306X04%22%2C%22out_trade_no%22%3A%2208212004263850947402455%22%2C%22total_amount%22%3A%221.00%22%2C%22subject%22%3a%22%e6%b1%87%e4%bb%98%e6%b5%8b%e8%af%95%e6%a0%b7%e4%be%8b%22%2c%22app_id%22%3A%222021001141635442%22%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay&notify_url=https%3A%2F%2Fexample.cloudpnr.com%2Fapi%2Ftdbp-biptd-union%2Fat%2Fali%2Ftrans%2Fvk&sign=a8qq3GxCexrXQKJ8JJiB29%2FbTlPknDqrh%2F0XkqE%2BYB62Vy4%2F95007d8ds8xRR2uH5A14bo9LjUXqQ7b6zJpwVA5ZLDiWNjaHssE6EcO1bGcgKogmf765AF3afqp5tq%2BEaqtqYJsNFdIFynInT73NWLGMqxl3j35%2BYIE8%2FujTzDAPXyp6Dbz2K8HLSlw2Z%2F5K4ULB4%2FfNtgdW0%2FAToD%2B98Gdiy7qVxoywguxE3BhONDLW0lbkQIKPHOQKjGt3%2Bu6EbFwoNhaovhBlnzgIP2lGpagAwZFLfCUVHQR5J0iqqngYdqG2QqW6ScgpsFmd6t6lBZhKrJkMby2sMBbvcYWyiw%3D%3D&sign_type=RSA2&timestamp=2020-04-26+10%3A41%3A49&version=1.0

7. apple pay(11)
例: 862294812870108392736

返回码

返回码 返回描述
公共返回码  
H10059 APP、微信公众号、小程序支付时,APPID不能为空
H10060 买家用户ID不能为空
H10061 支付返回地址不能为空
H10062 商户未入驻
H10063 已支付成功
H10064 已支付失败
H10065 订单信息不匹配
H10066 未获取二维码链接
H10010 延时分账时分账串与入账信息必须为空
H10007 入账客户号、入账账户号与分账串信息必须输入一项
H10008 分账信息异常
H10009 分账串内容不能超过五个
H10012 分账串部分字段为空
H10013 分账串客户号信息格式错误
H10014 分账串账户信息格式错误
H10015 分账串金额格式错误
H10017 分账串分账客户号重复
H10019 分账串总金额不等于交易金额
H10039 手续费内扣不支持分账
H10096 交易类型不匹配
H10099 设备信息IP不能为空
H10102 场景信息不合法

微信公众号小程序对接手册

微信公众号小程序支付对接手册

准备工作

1.1 微信公众平台用户授权配置说明

在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.comhttp://qq.com 无法进行OAuth2.0鉴权

_static/images/wechatv2-1.png _static/images/wechatv2-2.png

如果授权地址配置不对的话,用户授权回调时会报如下错误:

_static/images/wechatv2-3.png

1.2 微信公众平台支付授权目录配置

上线前,商户需要提供唤起微信支付地址给到汇付,由汇付工作人员配置支付授权目录例如唤起微信支付地址为:https://test.xxx.com/api/hfpayweb/wxindex则配置支付授权目录:https://test.xxx.com/api/hfpayweb/如果支付授权目录配置不对话,支付唤起时会报如下错误:

_static/images/wechatv2-4.png

开发步骤

  • 流程:用户授权->获取openId->调汇付支付->唤起微信支付

2.1拼装生成二维码的URL地址

根据如下地址生成二维码: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 该URL地址实际上是微信授权地址,用户扫码后直接调起微信授权,用户同意授权后,页面直接跳转至redirect_uri。 URL地址示例: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx41c0xxxcxxxddxxx&redirect_uri=https%3A%2F%2Fhfpayts.cloudpnr.com%2Fapi%2Fhfpayweb%2FauthCallBack%2FappPay?response_type=code&scope=snsapi_base&state=f5dec61d-3b35-4b6b-a972-5acdf42f751b#wechat_redirect 注: scope=snsapi_base时用户默认授权,不会出现授权页面,用户授权时是无感的。 微信授权参数说明:

参数 说明
appid 微信公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type 返回类型,请填写字符串” code”
scope 应用授权作用域, snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid), snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 ) 静默授权使用snsapi_base
state 商户自定义参数。重定向后会返回该state参数,可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 固定参数

2.2通过微信回调返回的code换取openid

后台请求以下链接获取openid:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数 说明
appid 公众号唯一标识
secret 公众号的appsecret
code 微信回调返回的code
grant_type 固定字符串”authorization_code”
返回参数:
参数 说明
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
scope 用户授权的作用域,使用逗号(,)分隔
  • 正确时返回参数:
{
  "access_token":"ACCESS_TOKEN",
  "expires_in":7200,
  "refresh_token":"REFRESH_TOKEN",
  "openid":"OPENID",
  "scope":"SCOPE"
}
  • 错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}

2.3调支付管家APP支付接口获取pay_info

主要参数说明:

  • app_id = 公众号唯一标识
  • buyer_id = 上一步骤取得的openid
  • app_pay_type = 05(微信公众号)
  • 返回参数pay_info示例:
{"appId":"wx3c9719ebab09d0da","timeStamp":"1593509842","nonceStr":"9b9f2f3261f140f697a9c613046f7bc3","package":"prepay_id=wx30173722025461c067c6700b1777789400","signType":"RSA","paySign":"QFC6/R3/hz5CTwY5J3mlrKJ/bHihQTz183ikIMFv0NrbUgjgal6FYYD7gnvJTbDoO3dWeBY6Y2LrAmd/xWdpS9KJTLHTdUSPeC5kw6ry44EUB28YprjRlL8Znbx9KSdOKoatVJ1PhwK5nuEFMC/qAJWb0WEW61NziohsyxJIkAclorOAyhznXzsRO7bjDwFun2t/fI3friEGnQ34fbiNMPHWB2TPkrLYutI7+7JTg42Lf3KF8jF3prHYi/fu3A3JYNRaHYyvFgkbTddY7i8snBR+XPcVAejsKTgqczEXzJW8DF6pjbSK7LmrI9Wg+lVWfkXqQPF/Y0Yu5uF9qrFHcw=="}

2.4微信支付界面唤起

  • 微信公众号唤起支付

可参照微信官网:https://pay.weixin.qq.com/wiki/doc/api/external/jsapi.php?chapter=7_7&index=6

js初始化微信浏览器的WeixinJSBridge对象,唤起微信支付界面,并定义不同返回码的事件,示例:

/**
 * 确保微信JS加载完成
 * @param callback
 */
function wechatReady(callback) {
        if (typeof WeixinJSBridge == "undefined") {
                if (document.addEventListener) {
                        document.addEventListener('WeixinJSBridgeReady', callback, false);
                } else if (document.attachEvent) {
                        document.attachEvent('WeixinJSBridgeReady', callback);
                        document.attachEvent('onWeixinJSBridgeReady', callback);
                }
        } else {
                callback && callback();
        }
}


/**
 * JS 调起微信支付
 * @param payInfo
 */
function wechatPay(payInfo) {
//      alert('wechatPay');
        wechatReady(function () {
                var jsonMsg = payInfo.replace(/\"/g, "\"");
                var payInfoJson = JSON.parse(jsonMsg);
                WeixinJSBridge.invoke('getBrandWCPayRequest',
                        {
                                "appId": payInfoJson['appId'],
                                "nonceStr": payInfoJson['nonceStr'],
                                "package": payInfoJson['package'],
                                "paySign": payInfoJson['paySign'],
                                "signType": payInfoJson['signType'],
                                "timeStamp": payInfoJson['timeStamp']
                        },
                        function (res) {
//              alert('wechatPay callback:' + res.err_msg);
                                switch (res.err_msg) {
                                        case "get_brand_wcpay_request:ok": // 支付成功
                                                paySuccess(); // 支付成功函数
                                                break;
                                        case "get_brand_wcpay_request:cancel": // 支付过程中用户取消
                                                break;
                                        case "get_brand_wcpay_request:fail": // 支付失败
                                        default:
                                                payFail();// 支付失败函数
                                                break;
                                }
                        });
        });
}
  • 微信小程序唤起支付

小程序支付利用wx.requestPayment发起支付,示例:

// 1. 完成页面结构、布局、样式
// 2. 设计数据结构
// 3. 完成数据绑定
// 4. 设计交互操作事件
// 5. 数据存储
var app = getApp()   //实例化小程序,从而获取全局数据或者使用全局函数
// console.log(app.globalData)
var MD5Util = require('../../utils/md5.js');

Page({
  // ===== 页面数据对象 =====
  data: {
        input: '',
        todos: [],
        leftCount: 0,
        allCompleted: false,
        logs: [],
        price: 0.01,
        number: 18820000000,
        deviceNo: 10080925
  },

  // ===== 页面生命周期方法 =====
  onLoad: function () {

  },
  // ===== 事件处理函数 =====
  wxPay: function (e) {
        var code = ''     //传给服务器以获得openId
        var timestamp = String(Date.parse(new Date()))   //时间戳
        var nonceStr = ''   //随机字符串,后台返回
        var prepayId = ''    //预支付id,后台返回
        var paySign = ''     //加密字符串

        //获取用户登录状态
        wx.login({
          success: function (res) {
                if (res.code) {
                  code = res.code
                  //发起网络请求,发起的是HTTPS请求,向服务端请求预支付
                  wx.request({
                        url: 'http://sellbin.natapp1.cc/prepay',
                        data: {
                          code: res.code
                        },
                        success: function (res) {
                          console.log(res.data);
                          if (res.data.result == true) {
                                var payInfoJson = JSON.parse(jsonMsg);
                                // 发起微信支付
                                wx.requestPayment({
                                  'timeStamp': payInfoJson['timestamp'],
                                  'nonceStr': payInfoJson['nonceStr'],
                                  'package': payInfoJson['package'],
                                  'signType': payInfoJson['signType'],
                                  'paySign': payInfoJson['paySign'],
                                  'success': function (res) {
                                        // 保留当前页面,跳转到应用内某个页面,使用wx.nevigeteBack可以返回原页面
                                        wx.navigateTo({
                                          url: '../pay/pay'
                                        })
                                  },
                                  'fail': function (res) {
                                        console.log(res.errMsg)
                                  }
                                })
                          } else {
                                console.log('请求失败' + res.data.info)
                          }
                        }
                  })
                } else {
                  console.log('获取用户登录态失败!' + res.errMsg)
                }
          }
        });
  },
   formSubmit: function (e) {
        console.log('form发生了submit事件,携带数据为:', e.detail.value)
  },
  formReset: function () {
        console.log('form发生了reset事件')
  }
})

注:支付成功后的回调页 为 支付管家app支付接口请求时传入的ret_url。

支付宝小程序生活号支付对接手册

支付宝小程序生活号支付对接手册

支付宝开发平台配置

  1. 设置支付目录登录开发平台

登录地址:https://docs.open.alipay.com/399/106843/

_images/alipay-1.png

1.2 创建网页应用

_images/alipay-2.png

1.3配置

_images/alipay-3.png _images/alipay-4.png

注:授权回调地址,是支付宝用户授权后回调的地址

  1. 支付宝支付

流程:用户授权,获取用户openId->调汇付支付接口获取支付宝payInfo->唤起支付宝支付

2.1 用户授权获取用户id

  • 按照规则拼接授权页面的链接,并且引导用户跳转至该链接;
  • 用户在授权页面上确认授权后,将跳转到开发者指定的回调页,并且带上auth_code;
  • 开发者通过auth_code换取access_token及用户的userId;
  • 支付宝文档可见:https://docs.open.alipay.com/220/105337/

第一步:URL拼接与scope详解

url参数说明

参数名 是否必须 描述
app_id 开发者应用的app_id
scope 此处固定填auth_base字符串
redirect_uri 回调页面,是 经过转义 的url链接(url必须以http或者https开头),比如:http%3A%2F%2Fexample.com 注:在请求之前,开发者需要先到开发者中心对应应用内,配置授权回调地址。
state 商户自定义参数,用户授权后,重定向到redirect_uri时会原样回传给商户。 为防止CSRF攻击,建议开发者请求授权时传入state参数,该参数要做到既不可预测,又可以证明客户端和当前第三方网站的登录认证状态存在关联。

第二步:获取auth_code

  • 当用户授权成功后,会跳转至开发者定义的回调页面,支付宝会在回调页面请求中加入参数,包括auth_code、app_id、scope等,需要注意的是支付宝仅保证auth_code、app_id以及scope参数的有效性。支付宝请求开发者回调页面示例如下:
http://example.com/doc/toAuthPage.html?app_id=2014101500013658&source=alipay_wallet&scope=auth_userinfo&auth_code=ca34ea491e7146cc87d25fca24c4cD11

第三步:使用auth_code换取接口access_token及用户userId

  • 接口名称:alipay.system.oauth.token
  • 换取授权访问令牌,开发者可通过获取到的auth_code换取access_token和用户userId。auth_code作为换取access_token的票据,每次用户授权完成,回调地址中的auth_code将不一样,auth_code只能使用一次,一天未被使用自动过期。
  • 接口请求示例
       REQUEST URL: https://openapi.alipay.com/gateway.do

       REQUEST METHOD: POST

       CONTENT:

        app\_id=2014070100171525

        method=alipay.system.oauth.token

        charset=GBK

        sign\_type=RSA2

        timestamp=2014-01-01 08:08:08


        sign=rXaTEfJ7WTDsP1DWRPHARW3uOr19+fzlngMCJBvbhP1XPEa9qZwGGng9oMDloABpJMT2SGeOj46+BUkqCGRO9fH90Vci3hOH01BfYnbhJz3ADK2h7gpjlponx4/sxELN6f2GXi51XKiHKnxMA9XpLLo68q+roY0M/ZFQ1UdnqeM=

        version=1.0

        grant\_type=authorization\_code

        code=4b203fe6c11548bcabd8da5bb087a83b

        refresh\_token=201208134b203fe6c11548bcabd8da5bb087a83b

..

接口调用示例

AlipayClient alipayClient =new
DefaultAlipayClient("https://openapi.alipay.com/gateway.do",APP\_ID,APP\_PRIVATE\_KEY,"json","GBK",ALIPAY\_PUBLIC\_KEY);

AlipaySystemOauthTokenRequest request = new
AlipaySystemOauthTokenRequest();

request.setCode("2e4248c2f50b4653bf18ecee3466UC18");

request.setGrantType("authorization\_code");

try {

AlipaySystemOauthTokenResponse oauthTokenResponse =
alipayClient.execute(request);

System.out.println(oauthTokenResponse.getAccessToken());

} catch (AlipayApiException e) {

//处理异常

e.printStackTrace();

}

请求参数说明

参数 参数名称 类型(长度范围) 参数说明 是否可为空 样例
grant_type 授权类型 String 值为authorization_code时,代表用code换取;值为refresh_token时,代表用refresh_token换取 不可空 authorization_code
code 授权码 String 用户对应用授权后得到,即第二步中开发者获取到的auth_code值 与refresh_token二选一 4b203fe6c11548bcabd8da5bb087a83b
refresh_token 刷新令牌 String 刷新access_token时使用 与code二选一 201208134b203fe6c11548bcabd8da5bb087a83b

同步响应结果示例

{

         "alipay\_system\_oauth\_token\_response": {

         "access\_token": "publicpBa869cad0990e4e17a57ecf7c5469a4b2",

         "user\_id": "2088411964574197",

         "alipay\_user\_id": "20881007434917916336963360919773",

         "expires\_in": 300,

         "re\_expires\_in": 300,

         "refresh\_token": "publicpB0ff17e364f0743c79b0b0d7f55e20bfc"

         },

         "sign":
        "xDffQVBBelDiY/FdJi4/a2iQV1I7TgKDFf/9BUCe6+l1UB55YDOdlCAir8CGlTfa0zLYdX0UaYAa43zY2jLhCTDG+d6EjhCBWsNY74yTdiM95kTNsREgAt4PkOkpsbyZVXdLIShxLFAqI49GIv82J3YtzBcVDDdDeqFcUhfasII="

}

同步响应参数说明

参数 参数名称 类型(长度范围) 参数说明 是否可为空 样例
access_token 交换令牌 String 用于获取用户信息 不可空 publicpBa869cad0990e4e17a57ecf7c5469a4b2
user_id 用户的userId String 支付宝用户的唯一userId 不可空 2.08841E+15
expires_in 令牌有效期 Number 交换令牌的有效期,单位秒 不可空 300
re_expires_in 刷新令牌有效期 Number 刷新令牌有效期,单位秒 不可空 300
refresh_token 刷新令牌 String 通过该令牌可以刷新access_token 不可空 publicpB0ff17e364f0743c79b0b0d7f55e20bfc

2.2调用支付管家app支付

app_id = 开发者应用的app_id

buyer_id = 上一步骤取得的openid

app_pay_type = 06(支付宝小程序/生活号)

获取接口返回的pay_info字段

2.3 JS唤起支付宝界面

js初始化支付宝浏览器的AlipayJSBridge对象,唤起支付宝支付界面,并定义不同返回码的事件。

例如:

/**
 * 确保支付宝JS已经加载完成
 * @param callback
 */
function alipayReady(callback) {
        if (window.AlipayJSBridge) {
                callback && callback();
        } else {
                document.addEventListener('AlipayJSBridgeReady', callback, false);
        }
}

/**
 * JS 调起支付宝支付
 * @param payInfo
 */
function alipayPay(payInfo) {
        alipayReady(function () {
                var jsonMsg = payInfo.replace(/\"/g, "\"");
                var payInfoJson = JSON.parse(jsonMsg);
                AlipayJSBridge.call('tradePay', payInfoJson, function (result) {
                        var resultCode = result['resultCode'];
                        switch (resultCode) {
                                case "9000": // 订单支付成功
                                   paySuccess();
                                case "8000": // 正在处理中
                                   queryPayStat();
                                   break;
                                case "6002": // 网络连接出错
                                   showMiniToast("网络出了点问题")
                                        break;
                                case "6001": // 用户中途取消
                                case "99":   // 用户点击忘记密码导致快捷界面退出(only iOS)
                                   $('#toAuthCodeUrl').remove();
                                   selectedTransType = 22;
                                   break;
                                case "4000": // 订单支付失败
                                default:
                                        showMiniToast("支付宝支付失败!", 5000);
                                        break;
                        }
                });
        });
}

注:支付成功后的回调页 为 支付管家app支付接口请求时传入的ret_url。

银联云闪付对接手册

银联云闪付对接手册

银联云闪付开发流程

1.对接流程 商户调用支付管家app支付接口进行下单获取银联支付流水号,返回给商户的app端。商户app需要集成配置云闪付提供的客户端sdk,通过sdk可唤起云闪付应用。

_images/unionpay-1.jpg

2.客户端唤起云闪付示例

2.1下载云闪付SDK包

_images/unionpay-2.png

2.2 把sdk嵌入到手机端项目

  • 以下是安卓示例:

    把下面的包复制到手机端项目的libs目录下

    手机支付控件开发包(安卓版)..3.4.8\app开发包\控件开发包\upmp_android\sdkPro\UPPayAssistEx.jar

    手机支付控件开发包(安卓版)..3.4.8\app开发包\控件开发包\upmp_android\sdkPro\ jar

    安卓版demo:

  • 主要代码如下:

    private final View.OnClickListener mClickListener = new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
    
                            if (v.getId() == R.id.btn0) {
                                    Log.e(LOG_TAG, " " + v.getTag());
                                    String _tn = tn_et.getText().toString();
                                    doStartUnionPayPlugin(BaseActivity.this, _tn, mMode);
                            } else if (v.getId() == R.id.btn1){
                                    Log.e(LOG_TAG, " " + v.getTag());
                                    String _tn = tn_et.getText().toString();
                                    doStartUnionPayPluginSE(BaseActivity.this, _tn, mMode);
                            }else if (v.getId() == R.id.cmb_btn){
                                    Intent intent = new Intent(BaseActivity.this,CMBSActivity.class);
                                    startActivity(intent);
                            }
                    }
            };
    
注:以上为模拟唤起demo,正式对接时,其中tn_et.getText().toString(),替换为支付管家app支付接口返回的pay_info。

pay021 扫码支付

功能说明

  • 适用产品企账通/app+,商户调用该接口生成订单二维码,并展示在PC或手机上,用户使用微信、支付宝APP扫描二维码并完成支付。
  • 自2019年5月5日起上线的新商户,完成入驻后商户需继续完成自身微信官方实名认证后才能进行交易,实名认证流程请参考 商户实名认证指引 完成实名认证。
  • 聚合正扫支持使用微信、支付宝app扫码支付,聚合正扫用户支付失败时,不发送异步通知,只有用户支付成功才发送异步通知。

调用方式:页面返回(同步,异步)

调用地址:

请求参数

参数中文名称 参数名称 数据格式 是否必须 说明
版本号 version 定长2位String 必须 目前固定为10
商户客户号 mer_cust_id 定长16位String 必须 由汇付生成,商户的唯一性标识 出账方商户客户号
订单号 order_id 变长50位String 必须  
订单日期 order_date 定长8位String 必须  
用户客户号 user_cust_id 定长16位String 可选  
支付类型 app_pay_type 变长2位String 必须 01:微信正扫 02:支付宝正扫 03:银联正扫 15:聚合正扫
分账类型 div_type 定长1位String 可选 0=实时分账 1=延时分账 延时分账时,in_cust_id、in_acct_id、div_detail必须为空 默认0=实时分账
入账客户号 in_cust_id 定长16位String 可选 入账客户号与分账账户串二选一传入
入账账户号 in_acct_id 变长9位String 可选 入账客户号不为空时生效
分账账户串 div_details 变长512位String 可选 入账客户号与分账账户串二选一传入 数据格式: [{‘divCustId’:‘6666000000025350’,’divAcctId’:‘78276’,’divAmt’:‘50.00’},{‘divCustId’:‘6666000000025666’,’divAcctId’:‘78841’,’divAmt’:‘50.00’ }] 内容说明见下文分账串内容定义 注:分账串金额之和需等于总金额 最多支持5条分账指令
交易金额 trans_amt 变长14位String 必须 泛指交易金额,金额格式必须是###.00,比如2.00,2.01
手续费客户号 fee_cust_id 定长16位String 可选 用于指定手续费收取客户号
手续费账户号 fee_acct_id 变长9位String 可选 用于指定手续费收取账户号 传手续费客户号时必填,必须是属于手续费客户号下的账户号
禁用贷记卡 limit_pay 定长1位的String 可选 1为禁用,否则可不填
商品标记 goods_tag 变长32位String 可选 微信公众号、小程序使用
是否原生态 is_raw 定长1位String 可选 微信公众号、小程序使用 0:否 1:是 不填则默认1
附加信息 attach_info 变长128位String 可选 微信公众号支付的参数
商品描述 goods_desc 变长127位String 必填  
商品类型 goods_type 定长4位String 可选 MCC 银联时不填则默认取商户信息中的
订单超时时间 order_expire_time 定长14位String 可选  
支付返回地址 ret_url 变长128位的String 可选 微信公众号支付时,必须输入 用于微信支付成功后跳转的页面; 支付宝统一下单时,必须输入; 微信小程序时,必须输入
商户后台应答地址 bg_ret_url 变长128位String 可选 通过后台异步通知,商户应在应答接收的响应中输出RECV_ORD_ID字样的字符串,表明商户已经收到该笔交易结果。 注意: 1) URL中请不要包含特殊字符 2) 必须是外网地址
设备信息 dev_info_json 变长1024位String 必填 ipAddr和devType必填 {“ipAddr”:”10.99.195.11”,”devType”:”2”,”MAC”:”D4-81-D7-F0-42-F8”,”IMEI”:”3553200846666033”}
商户私有域 mer_priv 变长120位String 可选  
扩展域 extension 变长512位String 可选  
买家支付宝账号 buyer_logon_id   可选 仅供支付宝统一下单测试使用,因为获取不到支付宝用户ID,测试需填支付宝账号,该字段仅透传,不做校验及业务操作
请求客户端类型 request_type 定长1位String 可选 P=PC端 M=移动端,不填默认PC
微信appId app_id 定长32位String 可选 该参数只对聚合正扫有效,选填,如果传入该参数,则聚合正扫中用户使用微信app扫描二维码时,使用传入的微信appId进行支付,否则使用汇付默认的微信appId进行支付
交易发生地 transaction_addr 定长64位String 必填 例如:上海
用途 purpose 定长256位String 必填 例如:其他

分账串格式: 注:分账串最大支持5个

参数中文名称 参数名称 数据格式 是否必须 说明
分账客户号 divCustId 定长16位String 必须  
分账账户号 divAcctId 定长9位String 必须  
分账金额 divAmt 变长14位String 必须 泛指交易金额,金额格式必须是###.00,比如2.00,2.01

设备信息:

字段 字段描述 是否必须
devType 设备类型 1.电脑;2.手机 必填
ipAddr IP地址 必填
MAC MAC地址 选填
IMEI IMEI码 选填
devSysType 设备系统类型 1.IOS;2.安卓;3.windows 选填
UUID UUID 选填
IMSI IMSI码 选填
ICCID ICCID码 选填
MEID MEID码 选填
SEID SEID 选填
ipType IP地址类型代理、家庭、办公环境、网吧、学校等,直接给中文名称 选填
ipProvName IP省 选填
ipCityName IP市 选填
ipAreaName IP地区 选填
ipProvCode IP省编码 选填
ipCityCode IP市编码 选填
ipAreaCode IP地区编码 选填
cenX 定位(经度) 选填
cenY 定位(纬度) 选填
provName 定位地址(省) 选填
cityName 定位地址(市) 选填
areaName 定位地址(区) 选填
provCode 定位(省编码) 选填
cityCode 定位(市编码) 选填
areaCode 定位(区编码) 选填
unDevCode 用户交易设备(唯一识别码) 选填
serviceProviderIp 商户服务IP地址 选填
merUrl 商户网址 选填

返回参数

参数中文名称 参数名称 数据格式 是否必须 说明
应答返回码 resp_code 定长6位String 必须  
应答返回描述 resp_desc 变长String 必须 返回码的对应中文描述
银行返回码 bg_bank_code 变长32位String 可选  
银行返回描述 bg_bank_desc 变长200位String 可选  
商户客户号 mer_cust_id 定长16位String 必须 由汇付生成,商户的唯一性标识 出账方商户客户号
订单号 order_id 变长50位String 必须  
订单日期 order_date 定长8位String 必须  
本平台交易唯一标识号 platform_seq_id 变长20位String 可选  
外部订单流水号 out_trans_id 变长64位String 可选 外部订单流水号,指支付宝、微信、银联流水号
外部商家订单号 party_order_id 变长64位String 可选 第三方订单号
用户客户号 user_cust_id 定长16位String 必须  
支付类型 app_pay_type 变长2位String 必须 01:微信正扫 02:支付宝正扫 03:银联正扫 15:聚合正扫
入账客户号 in_cust_id 定长16位String 可选 入账客户号与分账账户串二选一传入
入账账户号 in_acct_id 变长9位String 可选 入账客户号不为空时生效
分账类型 div_type 定长1位String 可选 0=实时分账 1=延时分账 延时分账时,in_cust_id、in_acct_id、div_detail必须为空 默认0=实时分账
分账账户串 div_details 变长String 可选 入账客户号与分账账户串二选一传入 数据格式: [{‘divCustId’:‘6666000000025350’,’divAcctId’:‘78276’,’divAmt’:‘50.00’},{‘divCustId’:‘6666000000025666’,’divAcctId’:‘78841’,’divAmt’:‘50.00’ }] 内容说明见下文分账串内容定义 注:分账串金额之和需等于总金额 最多支持5条分账指令
交易金额 trans_amt 变长14位String 必须 泛指交易金额,金额格式必须是###.00,比如2.00,2.01
手续费客户号 fee_cust_id 定长16位String 可选 用于指定手续费收取客户号
手续费账户号 fee_acct_id 变长9位String 可选 用于指定手续费收取账户号 传手续费客户号时必填,必须是属于手续费客户号下的账户号
手续费金额 fee_amt 变长14位String 可选  
商品标记 goods_tag 变长32位String 可选 微信公众号、小程序使用
是否原生态 is_raw 定长1位String 可选 微信公众号、小程序使用 0:否 1:是 不填则默认1
附加信息 attach_info 变长128位String 可选 微信公众号支付的参数
商品描述 goods_desc 变长127位String 必填  
商品类型 goods_type 定长4位String 可选 银联MCC 银联时不填则默认取商户信息中的
订单超时时间 order_expire_time 定长14位String 可选  
可分账金额 real_trans_amt 变长14位String 可选 延迟分账用,订单交易成功时有效; 该字段配合“延时分账确认”接口的“非手续费分摊模式” 使用,如果“延时分账确认”接口中字段share_fee_mode=1(手续费分摊模式),则忽略字段real_trans_amt
支付返回地址 ret_url 变长128位String 可选 微信公众号支付时,必须输入 用于微信支付成功后跳转的页面; 支付宝统一下单时,必须输入; 微信小程序时,必须输入
商户后台应答地址 bg_ret_url 变长128位String 可选 通过后台异步通知,商户应在应答接收的响应中输出RECV_ORD_ID字样的字符串,表明商户已经收到该笔交易结果。 注意: 1) URL中请不要包含特殊字符 2) 必须是外网地址
设备信息 dev_info_json 变长1024位String 必填 {‘devType’:‘2’,’devSysType’:‘1’,’UUID’:’‘,’MAC’:’‘,’IMEI’:’‘,’IMSI’:’‘,’ICCID’:’‘,’MEID’:’‘,’SEID’:’‘,’ipAddr’:‘10.99.195.11’,’ipType’:’‘,’ipProvName’:’‘,’ipCityName’:’‘,’ipAreaName’:’‘,’ipProvCode’:’‘,’ipCityCode’:’‘,’ipAreaCode’:’‘,’cenX’:’‘,’cenY’:’‘,’provName’:’‘,’cityName’:’‘,’areaName’:’‘,’provCode’:’‘,’cityCode’:’‘,’areaCode’:’‘,’unDevCode’:’‘,’serviceProviderIp’:’‘,’merUrl’:’‘}
商户私有域 mer_priv 变长120位String 可选  
扩展域 extension 变长512位String 可选  
支付地址 pay_url 变长64位String 可选 同步返
动态口令 token_id 变长64位String 可选 同步返
支付信息 pay_info 变长String 可选 同步返
请求客户端类型 request_type 定长1位String 可选 P=PC端 M=移动端
禁用贷记卡 limit_pay 定长1位String 可选 1为禁用
收费方式 fee_flag 定长1位String 可选 I-内扣 O-外扣

返回码

返回码 返回描述
公共返回码  
H10062 商户未入驻
H10063 已支付成功
H10064 已支付失败
H10065 订单信息不匹配
H10066 未获取二维码链接
H10010 延时分账时分账串与入账信息必须为空
H10007 入账客户号、入账账户号与分账串信息必须输入一项
H10008 分账信息异常
H10009 分账串内容不能超过五个
H10012 分账串部分字段为空
H10013 分账串客户号信息格式错误
H10014 分账串账户信息格式错误
H10015 分账串金额格式错误
H10017 分账串分账客户号重复
H10019 分账串总金额不等于交易金额
H10039 手续费内扣不支持分账
H10112 不支持该扫码方式
H10113 微信密钥未配置

页面展示

_images/scan_pay_01.png _images/scan_pay_02.png