前言:博主最近在开发多端小程序 ,还有两个后台系统
uniapp可以使用uni.requestPayment()方法唤起各端支付功能
但是基于每个平台支付流程和所需要的参数差异性,还是需要按照原生的方式写
目录
微信小程序支付
小程序调起支付数据签名字段列表:
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
小程序ID | appId | 是 | String | wxd678efh567hg6787 | 微信分配的小程序ID |
时间戳 | timeStamp | 是 | String | 1490840662 | 时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间 |
随机串 | nonceStr | 是 | String | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,不长于32位。推荐随机数生成算法 |
数据包 | package | 是 | String | prepay_id=wx2017033010242291fcfe0db70013231072 | 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=wx2017033010242291fcfe0db70013231072 |
签名方式 | signType | 是 | String | MD5 | 签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致 |
举例如下:
paySign = MD5(appId=wxd678efh567hg6787&nonceStr=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&package=prepay_id=wx2017033010242291fcfe0db70013231072&signType=MD5&timeStamp=1490840662&key=qazwsxedcrfvtgbyhnujmikolp111111) = 22D9B4E54AB1950F51E0649E8810ACD6
详细签名算法请参考“签名算法”说明
调用wx.requestPayment(OBJECT)发起微信支付
Object参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
timeStamp | String | 是 | 时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间 |
nonceStr | String | 是 | 随机字符串,长度为32个字符以下。 |
package | String | 是 | 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=* |
signType | String | 是 | 签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致 |
paySign | String | 是 | 签名,具体签名方案参见微信公众号支付帮助文档; |
success | Function | 否 | 接口调用成功的回调函数 |
fail | Function | 否 | 接口调用失败的回调函数 |
complete | Function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
回调结果:
回调类型 | errMsg | 说明 |
---|---|---|
success | requestPayment:ok | 调用支付成功 |
fail | requestPayment:fail cancel | 用户取消支付 |
fail | requestPayment:fail (detail message) | 调用支付失败,其中 detail message 为后台返回的详细失败原因 |
示例代码:
wx.requestPayment(
{
'timeStamp': '',
'nonceStr': '',
'package': '',
'signType': 'MD5',
'paySign': '',
'success':function(res){},
'fail':function(res){},
'complete':function(res){}
})
头条小程序支付
requestPayment
发起头条支付。
提示
目前只支持支付宝
提示
本 API 依赖于login
,请确保调用前已经调用了该API。
输入
继承标准对象输入,扩展属性描述:
名称 | 数据类型 | 属性 | 默认值 | 描述 |
---|---|---|---|---|
data | object | required | N/A | 支付相关的数据集合 |
data
格式
名称 | 数据类型 | 属性 | 默认值 | 是否参与 sign | 描述 |
---|---|---|---|---|---|
app_id | string | required | N/A | 是 | 支付分配给业务方的 id |
method | string | required | N/A | 否 | 固定值 "tp.trade.confirm" |
sign | string | required | N/A | 否 | 商户签名 |
sign_type | string | required | N/A | 是 | 签名算法,暂支持 MD5 |
timestamp | string | required | N/A | 是 | 发送请求的时间戳 |
trade_no | string | required | N/A | 是 | 支付订单号 |
merchant_id | string | required | N/A | 是 | 商户 id |
uid | string | required | N/A | 是 | 用户的唯一标识 id,开发者请传 openid,获取方法 |
total_amount | number | required | 0 | 是 | 订单金额,单位为分 |
pay_channel | string | required | N/A | 否 | 支付渠道,目前只支持支付宝,值为 "ALIPAY_NO_SIGN" |
pay_type | string | required | N/A | 否 | 支付方式,目前只支持支付宝,值为 "ALIPAY_APP" |
risk_info | string | required | N/A | 否 | 风控信息,标准 json 格式字符串(JSON.stringify({ip: "...."})),目前需要传入用户的真实 IP |
params | string | required | N/A | 是 | 传递给支付方的支付信息,标准 json 格式字符串(JSON.stringify({url: "...."})),不同的支付方参数格式不一样 |
return_url | string | optional | N/A | 否 | (支付宝)支付完成返回的地址 |
show_url | string | optional | N/A | 否 | (支付宝)支付失败返回的地址 |
支付宝params
格式
名称 | 数据类型 | 属性 | 默认值 | 描述 |
---|---|---|---|---|
url | string | required | N/A | 最终可以吊起支付宝的最终的字符串,url 拼接规则参考App支付请求参数说明 |
输出
回调类型 | errMsg | 描述 |
---|---|---|
success | requestPayment:ok | 调用支付成功 |
fail | requestPayment:fail cancel | 用户取消支付 |
fail | requestPayment:fail ${detail message} | 调用支付失败,其中 detail message 为后台返回的详细失败原因 |
代码示例
tt.requestPayment({
data: {
app_id: '800000040005',
method: 'tp.trade.confirm',
sign: '4e70a84d9080e74a1a00b715818b809b',
sign_type: 'MD5',
timestamp: '1534342228111',
trade_no: '20180821162045321823181631558207',
merchant_id: '1300000004',
uid: '6287430262',
total_amount: 12,
pay_channel: 'ALIPAY_NO_SIGN',
pay_type: 'ALIPAY_APP',
params: JSON.stringify({
// 如果是新版支付宝,url 示例:
url: 'app_id=2018041302549907&biz_content=%7B%22body%22%3A%22novel%22%2C%22subject%22%3A%22%E6%B5%8B%E8%AF%95%E7%9A%84%E5%95%86%E5%93%81%22%2C%22out_trade_no%22%3A%22201808211756233909095950%22%2C%22timeout_express%22%3A%2230m%22%2C%22total_amount%22%3A%220.01%22%2C%22seller_id%22%3A%22jrtoutiaoyxgs%40bytedance.com%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&charset=utf-8&format=JSON&method=alipay.trade.app.pay¬ify_url=https%3A%2F%2Ftp-pay-test.snssdk.com%2Fcallback%2Fali_pay&sign=ZfVkvu%2FSzBqFuqQMgr6MvsXomlr6BCuz7GYDnpsxd3SLVfCssV0q2cnxZyfjh%2FY%2Bk7PO1IeEl4rppQg%2FXgRuIqMXyKdhmigj4oPdQVJEkbSQEcCW4m8mwpXLNjlLH%2FHae3u3hjrMDVPuVXeIxjoq1NLPXy09GY5u1MX8E2lkn8xtmOxA2cXXRIrAa8gTplUoXWkSSkZMgvSTzQ9RjRmlKtK4nERdDWh5RBXLNDU%2FD2FfqIeZuLNZh%2BW8j4dYGtPDm9nWYRz0tLizJDm6E76aTM3qvLi0havCCrHgxZ5d8tVN7GNztA6olbGOiXubEGUq4yBqCojiALEEVpKqfQdZGQ%3D%3D&sign_type=RSA2×tamp=2018-08-21+17%3A56%3A24&version=1.0'
// 如果是老版支付宝,url 示例:
url: '_input_charset=\"utf-8\"&body=\"novel\"&it_b_pay=\"30m\"¬ify_url=\"https://tp-pay-test.snssdk.com/callback/ali_pay\"&out_trade_no=\"201808211755020406852103\"&partner=\"2088801374045154\"&payment_type=\"1\"&seller_id=\"adsense@bytedance.com\"&service=\"mobile.securitypay.pay\"&subject=\"测试的商品\"&total_fee=\"0.01\"&sign=\"RGdwAoCy5DsjdFBdtrN9WzdYtyZGlUHn8dbAQVQsIPidLTR9s%2BCVtAj%2BtYzL8oAHP0IXJZw8U6EGlyA2MG2ZxhJRI1N1RhDMZOz56eAXO%2FITZYiGSB01hkhx9yhqmWAUJQfUMRHJZswS1DEpwam1JfaoahZ%2Bf%2FEE%2FkvG6ma67t4%3D\"&sign_type=\"RSA\"'
}),
},
success (res) {
console.log(res.errMsg);
},
fail (res) {
console.log(res.errMsg);
}
})
支付宝小程序支付
调用接口
在开发者调用接口前,请先了解 小程序框架 和支付宝开放平台服务端 SDK。开放平台服务端 SDK 包含了 JAVA、PHP、Python、NodeJS 和 .NET五种语言版本,封装了签名、验签和 HTTP 接口请求等基础功能。请先下载对应语言版本的 SDK 并引入您的开发工程。
在 SDK 调用前需要进行初始化,以 JAVA 代码为例:
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
小程序支付调用流程如下图所示:
主要步骤
1.在小程序端调用 my.request 接口,连接到商户服务端。
my.request({
url: '商户服务端地址',//须加httpRequest域白名单
method: 'POST',
data: {//data里的key、value是开发者自定义的
from: '支付宝',
order: 'XXXXX',//订单信息
},
dataType: 'json',
success: function(res) {
my.alert({content: 'success'});
},
fail: function(res) {
my.alert({content: 'fail'});
},
complete: function(res) {
my.hideLoading();
my.alert({content: 'complete'});
}
});
2.在服务端调用 alipay.trade.create (统一收单交易创建接口),获得支付宝交易号 tradeNO(以 Java 代码为例)。
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.create.
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。
request.setBizContent("{" +
"\"out_trade_no\":\"20171115010101001\"," +
"\"total_amount\":0.01," +
"\"subject\":\"Iphone616G\"," +
"\"buyer_id\":\"用户pid\"" +
"}");
try {
//使用的是execute
AlipayTradeCreateResponse response = alipayClient.execute(request);
String trade_no = response.getTradeNo();//获取返回的tradeNO。
} catch (AlipayApiException e) {
e.printStackTrace();
}
注意:
在小程序场景内 alipay.trade.create 接口中的“buyer_id”为必填项,若未传入调式时会出现报错。推荐使用开放平台提供的服务端 SDK,并参考代码示例编写;点击下载服务端 SDK。具体业务参数请参考统一收单交易创建接口。
3.在小程序端使用 tradeNO,调用 my.tradePay 接口唤起支付收银台。
my.tradePay({
tradeNO: '2017111521001104105336677922',
success: function(res) {
my.alert(res.resultCode);
},
fail: function(res) {
my.alert(res.resultCode);
},
});
百度小程序支付
swan.requestPolymerPayment![](https://i-blog.csdnimg.cn/blog_migrate/d006a4829d0fce6200274bb70b555149.png)
基础库 1.8.5 版本开始支持。使用工具调试时为模拟支付,使用真机调试时可查看真实支付结果。在工具和真机中的实现有区别,详见API 实现差异。
解释: 百度收银台,聚合了主流的百度钱包、微信、支付宝、网银等多种支付方式,方便开发者一站式快速接入多种支付渠道,让百度用户能在智能小程序场景下,直接完成支付、交易闭环,提升用户支付体验的同时,提高智能小程序的订单转化率。
为了帮助开发者调用收银台接口,我们提供了Go语言版本封装了签名&验签、HTTP接口请求等基础功能,详见下载小程序支付demo。
了解更多信息,请查看百度收银台支付开通指引、支付功能开发。
方法参数:Object object
object
参数说明:
参数名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
orderInfo | Object | 是 | - | 订单信息 |
bannedChannels | StringArray | 否 | - | 需要隐藏的支付方式 |
success | Function | 否 | - | 接口调用成功的回调函数 |
fail | Function | 否 | - | 接口调用失败的回调函数 |
complete | Function | 否 | - | 接口调用结束的回调函数(调用成功、失败都会执行) |
orderInfo 参数说明:
参数 | 必填 | 说明 |
---|---|---|
dealId | 是 | 跳转百度收银台支付必带参数之一,是百度收银台的财务结算凭证,与账号绑定的结算协议一一对应,每笔交易将结算到dealId对应的协议主体。详见核心参数获取与组装。 |
appKey | 是 | 支付能力开通后分配的支付appKey,用以表示应用身份的唯一ID,在应用审核通过后进行分配,一经分配后不会发生更改,来唯一确定一个应用。详见核心参数获取与组装。 |
totalAmount | 是 | 订单金额,单位为人民币分。 |
tpOrderId | 是 | 商户平台自己记录的订单ID,当支付状态发生变化时,会通过此订单ID通知商户。 |
dealTitle | 是 | 订单的名称 |
signFieldsRange | 是 | 固定值1 |
rsaSign | 是 | 对appKey+dealId+tpOrderId+totalAmount 进行RSA加密后的签名,防止订单被伪造。签名过程见 签名与验签。 |
bizInfo | 是 | 订单详细信息,需要是一个可解析为JSON Object的字符串。字段内容见: bizInfo组装。 |
bannedChannels 参数说明:
channel | 说明 |
---|---|
Alipay | 支付宝 |
BDWallet | 百度钱包 |
微信支付 |
示例:
在开发者工具中预览效果
swan.requestPolymerPayment({
orderInfo: {
"dealId": "470193086",
"appKey": "MMMabc",
"totalAmount": "1",
"tpOrderId": "3028903626",
"dealTitle": "智能小程序Demo支付测试",
"signFieldsRange": "1",
"rsaSign": '',
"bizInfo": ''
},
success: function (res) {
swan.showToast({
title: '支付成功',
icon: 'success'
});
},
fail: function (err) {
swan.showToast({
title: JSON.stringify(err)
});
console.log('pay fail', err);
}
});
说明:
- 服务审核未通过会导致调起失败“商品不存在”等错误,需要移步“开发者平台-支付管理”查看服务审核状态;
- 整个orderInfo 是个 json 对象;
- bizInfo 这个键值是一个以字符串形式存放的json对象;
- 在调起收银台过程中,如开发者在任何一个环节没有严格按照文档要求操作均会导致此“签名错误”,请认真阅读文档。
——— 多点实践,多点收获