微信小程序 在线支付功能的实现

微信小程序 在线支付功能

最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出一辙,下面我就具体说一下小程序里微信支付的开发流程和注意点。

1.开通微信支付和微信商户号

这个过程就和开通服务号的微信支付过程一样,没有什么可以说的。

2.获得用户的openid

首页我们需要在小程序的客户端js中获取当前用户的openid,通过调用wx.login方法可以得到用户的code,然后开发者服务器使用登录凭证 code 获取 openid。

获取用户登录态失败!' + res.errMsg) } } });

<div class="jb51code">
<pre class="brush:js;">
var code = req.param("code");
request({
url: "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code",method: 'GET'
},function(err,response,body) {
if (!err && response.statusCode == 200) {
res.json(JSON.parse(body));
}
});

3.获取prepay_id和支付签名验证paySign

这一步的过程就和服务号里的微信支付过程一样,分为客户端和服务器端

首先来看一下客户端js

在服务号里,我们是通过如下的代码来调起支付功能

名称,由商户传入 "timeStamp":"",//时间戳,自1970年以来的秒数 "nonceStr":"",//随机串 "package":"prepay_id=<%=prepay_id%>","signType":"MD5",//微信签名方式: "paySign":"<%=_paySignjs%>" //微信签名 },function(res){ WeixinJSBridge.log(res.err_msg); if( res.err_msg =="get_brand_wcpay_request:ok"){ alert("支付成功!"); }else{ alert("支付失败!"); } } ); }

小程序里,我们是通过wx.requestPayment方法来调起支付功能,当然在这之前,我们先要获取prepay_id。

那在服务器端主要要实现的是prepay_id的获取和签名paySign

"; formData += "mch_id"; //商户号 formData += "nonce_str"; formData += "notify_url"; formData += "" + openid + ""; formData += "" + bookingNo + ""; formData += "spbill_create_ip"; formData += "" + total_fee + ""; formData += "JSAPI"; formData += "" + paysignjsapi(appid,attach,body,mch_id,nonce_str,notify_url,openid,bookingNo,spbill_create_ip,total_fee,'JSAPI') + ""; formData += ""; request({ url: url,body: formData },body) { if(!err && response.statusCode == 200) { var prepay_id = getXMLNodeValue('prepay_id',body.toString("utf-8")); var tmp = prepay_id.split('['); var tmp1 = tmp[2].split(']'); //签名 var _paySignjs = paysignjs(appid,'prepay_id=' + tmp1[0],'MD5',timeStamp); var o = { prepay_id: tmp1[0],_paySignjs: _paySignjs } res.send(o); } });

下面是用到的函数

function raw1(args) {
var keys = Object.keys(args);
keys = keys.sort()
var newArgs = {};
keys.forEach(function(key) {
newArgs[key] = args[key];
});

var string = '';
for(var k in newArgs) {
string += '&' + k + '=' + newArgs[k];
}
string = string.substr(1);
return string;
};

function paysignjsapi(appid,out_trade_no,trade_type) {
var ret = {
appid: appid,attach: attach,body: body,mch_id: mch_id,nonce_str: nonce_str,notify_url: notify_url,openid: openid,out_trade_no: out_trade_no,spbill_create_ip: spbill_create_ip,total_fee: total_fee,trade_type: trade_type
};
var string = raw(ret);
string = string + '&key='+key;
var crypto = require('crypto');
return crypto.createHash('md5').update(string,'utf8').digest('hex');
};

function raw(args) {
var keys = Object.keys(args);
keys = keys.sort()
var newArgs = {};
keys.forEach(function(key) {
newArgs[key.toLowerCase()] = args[key];
});

var string = '';
for(var k in newArgs) {
string += '&' + k + '=' + newArgs[k];
}
string = string.substr(1);
return string;
};

function getXMLNodeValue(node_name,xml) {
var tmp = xml.split("<" + node_name + ">");
var _tmp = tmp[1].split("</" + node_name + ">");
return _tmp[0];
}

这样简单3步,小程序的微信支付功能就接上了,下面是测试的支付效果图

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持

相关文章

1. 获取输入框数据wxml中的input上增加bindinput属性,和方法值在js部分定义与之对应的方法,只要在输入...
1.map组件的高度如果想要铺满屏幕,要是使用height:100vh样式2.获取位置要在app.json中标明权限3.先使用...
QQ小程序支付 Java后端 同学折腾QQ小程序的支付折腾了好几天,没有完成统一下单,因为我做过微信和支付...
前言: 在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个...
一、前言: 我发现很多的同学都在抱怨说微信小程序的picker的mode = selector/mode = multiSelector 无...
前言: 之前自己做一个uni-app的项目的时候前端需要实现一个比较复杂的动态tab和swiper切换的功能,但是...