APP支付(内置)
appPay.js
/**
* 5+App支付,仅支持支付宝以及微信支付
*
* 支付宝Sdk集成,微信sdk未集成
*
* @param : provider(String) ->被支付方
* @param : orderInfo(String) ->订单信息
* @param : success,fail(Json) ->回调后的json信息
*
*/
const mPay = (provider, orderInfo, success, fail) => (
uni.requestPayment({
provider,
orderInfo, //订单数据
success(res) {
success(JSON.stringify(res));
},
fail(err) {
fail(JSON.stringify(err));
}
});
)
export default mPay;
微信小程序支付(内置)
mPay.js
/**
* 微信小程序支付,仅支持微信支付(后续可能集成网页支付宝支付web-view)
* @param : provider(String) ->付款商家
* @param : timeStamp(String) ->时间戳(当前支付时间)
* @param : nonceStr(String) ->支付密匙
* @param : packages(String) ->支付id
* @param : signType(String) ->加密方式(默认MD5)
* @param : paySign(String)
*
* 小程序支付调用
*
* wePay(provider, timeStamp, nonceStr, packages, signType, paySign,res=>{},fail=>{})
*/
const wePay = (provider, timeStamp, nonceStr, packages, signType, paySign,success,fail) => (
uni.requestPayment({
provider,
timeStamp,
nonceStr,
package: packages,
signType,
paySign,
success(res) {
success(JSON.stringify(res));
},
fail(err) {
fail(JSON.stringify(err))
}
});
)
export default wePay;
公众号支付(如果使用微信官方weixin-js-sdk,请使用跨端兼容方案)
(需要引入模块:jweixin-module),详情见yarn以及npm安装
pPay.js
/*
微信支付方法(uni-app h5)适用
获取微信加签信息
@param{data}:获取的微信加签
@param{res}:成功回调
@param{fail}:失败回调
@warn:因为package为严格模式下的保留字,不能用作变量.
@use
wPay({
appId,
timeStamp,
nonceStr,
signature,
package,
paySign
},res=>{
console.log('调用成功!');
},fail=>{
console.log('调用失败!');
})
*/
const wx = require('jweixin-module');
const wexinPay = (data, cb, errorCb) => {
let [appId, timestamp, nonceStr, signature, packages, paySign] = [data.appId, data.timeStamp, data.nonceStr, data.signature,
data.package, data.paySign
];
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId, // 必填,公众号的唯一标识
timestamp, // 必填,生成签名的时间戳
nonceStr, // 必填,生成签名的随机串
signature, // 必填,签名,见附录1
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function() {
wx.chooseWXPay({
timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr, // 支付签名随机串,不长于 32 位
'package': packages, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign, // 支付签名
success(res) {
// 支付成功后的回调函数
cb(res);
},
fail(res) {
errorCb(res);
}
});
});
wx.error(function(res) {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
/*alert("config信息验证失败");*/
});
}
export default wexinPay;
关于H5详见微信官方WX-JS-SDK:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
参考:https://www.cnblogs.com/cisum/p/10142412.html
在小程序端调用 my.request 接口,连接到商户服务端,提交订单信息,返回TradeNo。
uni.request({
url: '商户服务端地址',//须加httpRequest域白名单
method: 'POST',
data: {//data里的key、value是开发者自定义的
from: '支付宝',
order: 'XXXXX',//订单信息
},
dataType: 'json',
success: function(res) {
uni.alert({content: 'success'});
},
fail: function(res) {
uni.alert({content: 'fail'});
},
complete: function(res) {
uni.hideLoading();
uni.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);
},
});