支付宝百度微信头条小程序支付功能实现(原生)

前言:博主最近在开发多端小程序 ,还有两个后台系统

uniapp可以使用uni.requestPayment()方法唤起各端支付功能

但是基于每个平台支付流程和所需要的参数差异性,还是需要按照原生的方式写

 

目录

微信小程序支付

头条小程序支付

支付宝小程序支付

百度小程序支付

 


 

微信小程序支付

小程序调起支付数据签名字段列表:

字段名变量名必填类型示例值描述
小程序IDappIdStringwxd678efh567hg6787微信分配的小程序ID
时间戳timeStampString1490840662时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间
随机串nonceStrString5K8264ILTKCH16CQ2502SI8ZNMTM67VS随机字符串,不长于32位。推荐随机数生成算法
数据包packageStringprepay_id=wx2017033010242291fcfe0db70013231072统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=wx2017033010242291fcfe0db70013231072
签名方式signTypeStringMD5签名类型,默认为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参数说明:

参数类型必填说明
timeStampString时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间
nonceStrString随机字符串,长度为32个字符以下。
packageString统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*
signTypeString签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致
paySignString签名,具体签名方案参见微信公众号支付帮助文档;
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

 

回调结果:

回调类型errMsg说明
successrequestPayment:ok调用支付成功
failrequestPayment:fail cancel用户取消支付
failrequestPayment: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。

输入

继承标准对象输入,扩展属性描述:

名称数据类型属性默认值描述
dataobjectrequiredN/A支付相关的数据集合

data格式

名称数据类型属性默认值是否参与 sign描述
app_idstringrequiredN/A支付分配给业务方的 id
methodstringrequiredN/A固定值 "tp.trade.confirm"
signstringrequiredN/A商户签名
sign_typestringrequiredN/A签名算法,暂支持 MD5
timestampstringrequiredN/A发送请求的时间戳
trade_nostringrequiredN/A支付订单号
merchant_idstringrequiredN/A商户 id
uidstringrequiredN/A用户的唯一标识 id,开发者请传 openid,获取方法
total_amountnumberrequired0订单金额,单位为分
pay_channelstringrequiredN/A支付渠道,目前只支持支付宝,值为 "ALIPAY_NO_SIGN"
pay_typestringrequiredN/A支付方式,目前只支持支付宝,值为 "ALIPAY_APP"
risk_infostringrequiredN/A风控信息,标准 json 格式字符串(JSON.stringify({ip: "...."})),目前需要传入用户的真实 IP
paramsstringrequiredN/A传递给支付方的支付信息,标准 json 格式字符串(JSON.stringify({url: "...."})),不同的支付方参数格式不一样
return_urlstringoptionalN/A(支付宝)支付完成返回的地址
show_urlstringoptionalN/A(支付宝)支付失败返回的地址

支付宝params格式

名称数据类型属性默认值描述
urlstringrequiredN/A最终可以吊起支付宝的最终的字符串,url 拼接规则参考App支付请求参数说明

输出

回调类型errMsg描述
successrequestPayment:ok调用支付成功
failrequestPayment:fail cancel用户取消支付
failrequestPayment: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&notify_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&timestamp=2018-08-21+17%3A56%3A24&version=1.0'
            // 如果是老版支付宝,url 示例:
            url: '_input_charset=\"utf-8\"&body=\"novel\"&it_b_pay=\"30m\"&notify_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);

小程序支付调用流程如下图所示:
Image 9.png

主要步骤

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

基础库 1.8.5 版本开始支持。使用工具调试时为模拟支付,使用真机调试时可查看真实支付结果。在工具和真机中的实现有区别,详见API 实现差异

解释: 百度收银台,聚合了主流的百度钱包、微信、支付宝、网银等多种支付方式,方便开发者一站式快速接入多种支付渠道,让百度用户能在智能小程序场景下,直接完成支付、交易闭环,提升用户支付体验的同时,提高智能小程序的订单转化率。

为了帮助开发者调用收银台接口,我们提供了Go语言版本封装了签名&验签、HTTP接口请求等基础功能,详见下载小程序支付demo

了解更多信息,请查看百度收银台支付开通指引支付功能开发

方法参数:Object object

object参数说明

参数名类型必填默认值说明
orderInfoObject-订单信息
bannedChannelsStringArray-需要隐藏的支付方式
successFunction-接口调用成功的回调函数
failFunction-接口调用失败的回调函数
completeFunction-接口调用结束的回调函数(调用成功、失败都会执行)

orderInfo 参数说明

参数必填说明
dealId跳转百度收银台支付必带参数之一,是百度收银台的财务结算凭证,与账号绑定的结算协议一一对应,每笔交易将结算到dealId对应的协议主体。详见核心参数获取与组装
appKey支付能力开通后分配的支付appKey,用以表示应用身份的唯一ID,在应用审核通过后进行分配,一经分配后不会发生更改,来唯一确定一个应用。详见核心参数获取与组装
totalAmount订单金额,单位为人民币分。
tpOrderId商户平台自己记录的订单ID,当支付状态发生变化时,会通过此订单ID通知商户。
dealTitle订单的名称
signFieldsRange固定值1
rsaSignappKey+dealId+tpOrderId+totalAmount进行RSA加密后的签名,防止订单被伪造。签名过程见 签名与验签
bizInfo订单详细信息,需要是一个可解析为JSON Object的字符串。字段内容见: bizInfo组装

bannedChannels 参数说明

channel说明
Alipay支付宝
BDWallet百度钱包
WeChat微信支付

示例
在开发者工具中预览效果

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对象;
  • 在调起收银台过程中,如开发者在任何一个环节没有严格按照文档要求操作均会导致此“签名错误”,请认真阅读文档。

                                                                                                                                                         ——— 多点实践,多点收获

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
现场大屏幕具有开幕墙、闭幕墙、消息墙、抽奖、签到、嘉宾展示、抢红包功能,利用开幕墙对整个活动的展示介绍、也适合活动进行中的间歇时间、消息墙可以再等待和互动的时候,让员工发布消息,是/一款非常流行的微信大屏幕系统。 重要说明:付费报名模式目前只支持开通微信支付的服务号。 1、本模块支持开幕墙、闭幕墙、消息墙、二维码扫描墙、3D签到墙(支持logo签到和文字签到)(4种展示效果)、多奖品切换现场抽奖、酷炫互动疯狂抢红包、嘉宾墙等,后续将再新增多个墙,敬请期待; 2、每个大屏幕都支持自定义背景、和背景有音乐功能,购买的客户将免费赠送背景素材包; 3、现场抽奖奖品支持同时设置多个奖品,并且可以设置每个奖品的顺序,方便根据奖品价值安排抽奖顺序,奖品支持实物和红包(); 4、抢红包奖品支持实物、微信卡券、红包等,支持自定义奖品数量、概率等; 5、抢红包支持设置每个人最多中奖次数、超过了就不会再中奖了; 6、抢红包活动支持设置赞助商广告,粉丝的中奖提示页面会弹出赞助广告; 7、抢红包活动支持多波活动举办,支持一波活动结束后直接重置,之前中奖的数据不会被清空,后台和中奖者手机端都可以看到并且兑换红包。 8、红包奖品支持直接发送和提现两种模式,方便做大额红包奖励。 9、3D签到墙支持4种展示方式,前后台都可以自由切换,手机端签到可以支持是/否需要填写个人信息,个人信息支持填写姓名、手机、公司/职位等; 10、大屏幕支持设置密码才能访问的功能; 11、消息墙支持开启是/否需要消息审核的功能,支持同时发生消息和图片的功能,并且支持图片再显示的时候是/否自动放大功能。 12、后台支持自定义活动流程说明,方便参与者再手机端直接查看活动流程。 13、支持开启和关闭强制关注才能参与活动的功能; 14、自带LBS限制地区功能,可以设置参与人的地区范围; 15、本模块只支持认证服务号使用(使用红包功能必须开通微信支付),其他非认证服务号的可以借用权限(借用权限的账号无法使用卡券功能); 运营方案推荐: 【公司年会方案】 使用开幕墙、闭幕墙、消息墙、抽奖、签到、嘉宾展示、抢红包功能,利用开幕墙对整个活动的展示介绍、也适合活动进行中的间歇时间、消息墙可以再等待和互动的时候,让员工发布消息。签到墙采用水晶球模式。 整个年会设置多波抢红包活动,利用抢红包重置功能,可以举办多波互动抢红包,既能引爆现场,又能回馈员工福利。 现场抽奖功能可以把奖品依次从低到高设置,把价值最高的放最后面。 【本地自媒体现场活动】 使用开幕墙、闭幕强、抢红包功能,开幕墙和闭幕墙可以做成赞助商广告墙,利用抢红包的高互动功能,并且可以举办多波的功能,快速引爆活动现场。 适用范围 微信墙、超级大屏幕、微信大屏幕、现场大屏幕 1、本地自媒体大号,拉商家赞助; 2、公司年会、学校、企事业单位等等; 3、微信运营服务提供商; 4、婚礼策划机构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值