微信小程序开发入门教程(三)---小程序云开发支付功能
<p>支付(shoukuan)功能真的很重要!由于我还没有商户号,以下代码未实际验证</p><p>1、服务端</p>
<p>进入云开发,新建云函数pay(应该也可以在开发者工具编写后上传)</p>
<p>编写后端代码index.js<br>这里用到第三方库wx-js-utils(<strong>https://github.com/lcxfs1991/wx-js-utils</strong> )</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> cloud = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx-server-sdk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> {
WXPay,
WXPayUtil
} </span>= require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx-js-utils</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
cloud.init();
</span><span style="color: rgba(0, 0, 255, 1)">const</span> appId = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx****************</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 小程序appid</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> mchId = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">152*******</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 商户号</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> key = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">****************************</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 商户密钥</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> timeout = <span style="color: rgba(128, 0, 128, 1)">10000</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 超时时间</span>
<span style="color: rgba(0, 0, 0, 1)">
let wxpay </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> WXPay({
appId,
mchId,
key,
timeout: </span><span style="color: rgba(128, 0, 128, 1)">10000</span><span style="color: rgba(0, 0, 0, 1)">,
signType: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MD5</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
useSandbox: </span><span style="color: rgba(0, 0, 255, 1)">false</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不使用沙箱环境</span>
<span style="color: rgba(0, 0, 0, 1)">});
exports.main </span>= async(<span style="color: rgba(0, 0, 255, 1)">event</span>, context) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">const</span> curTime =<span style="color: rgba(0, 0, 0, 1)"> Date.now();
</span><span style="color: rgba(0, 0, 255, 1)">const</span> tradeNo = `${<span style="color: rgba(0, 0, 255, 1)">event</span>.userInfo.openId.substr(-<span style="color: rgba(128, 0, 128, 1)">5</span>)}-${curTime}`; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 生成订单号</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> body = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">测试订单</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 订单商品名称</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> spbill_create_ip = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发起支付的IP</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> notify_url = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://www.qq.com</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 回调地址</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> total_fee = <span style="color: rgba(0, 0, 255, 1)">event</span>.price * <span style="color: rgba(128, 0, 128, 1)">100</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 支付金额,单位为分</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> time_stamp = <span style="color: rgba(128, 0, 0, 1)">''</span> + Math.ceil(Date.now() / <span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">const</span> out_trade_no =<span style="color: rgba(0, 0, 0, 1)"> `${tradeNo}`;
let orderParam </span>=<span style="color: rgba(0, 0, 0, 1)"> {
body,
spbill_create_ip,
notify_url,
out_trade_no,
total_fee,
openid: </span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.userInfo.openId,
trade_type: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">JSAPI</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
timeStamp: time_stamp,
};
</span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> {
return_code,
result_code,
...restData
} </span>= await wxpay.unifiedOrder(orderParam); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 统一下单</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (return_code === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">SUCCESS</span><span style="color: rgba(128, 0, 0, 1)">'</span> && result_code === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">SUCCESS</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> {
prepay_id,
nonce_str
} </span>=<span style="color: rgba(0, 0, 0, 1)"> restData;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> sign =<span style="color: rgba(0, 0, 0, 1)"> WXPayUtil.generateSignature({
appId,
nonceStr: nonce_str,
package: `prepay_id</span>=<span style="color: rgba(0, 0, 0, 1)">${prepay_id}`,
signType: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MD5</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
timeStamp: time_stamp
}, key); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 签名</span>
<span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
code: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">,
data: {
out_trade_no,
time_stamp,
...restData,
sign
}
}
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
code: </span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
}
};</span></pre>
</div>
<p>2、小程序</p>
<p>app.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">App({
onLaunch() {
wx.cloud.init({
traceUser: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
});
}
});</span></pre>
</div>
<p>index.wxml</p>
<div class="cnblogs_code">
<pre><view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">container</span><span style="color: rgba(128, 0, 0, 1)">'</span>>
<input <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ipt</span><span style="color: rgba(128, 0, 0, 1)">'</span> value=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{{price}}</span><span style="color: rgba(128, 0, 0, 1)">'</span> bindinput=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">onInput</span><span style="color: rgba(128, 0, 0, 1)">'</span> type=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">digit</span><span style="color: rgba(128, 0, 0, 1)">'</span> />
<button <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">btn-pay</span><span style="color: rgba(128, 0, 0, 1)">'</span> bindtap=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">pay</span><span style="color: rgba(128, 0, 0, 1)">'</span>>Pay</button>
</view></pre>
</div>
<p>index.wxss</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">.container {
display: flex;
flex</span>-<span style="color: rgba(0, 0, 0, 1)">direction: column;
width: 100vw;
height: 100vh;
justify</span>-<span style="color: rgba(0, 0, 0, 1)">content: center;
align</span>-<span style="color: rgba(0, 0, 0, 1)">items: center;
}
.ipt {
border</span>-<span style="color: rgba(0, 0, 0, 1)">bottom: 1px solid #f1f2f3;
text</span>-<span style="color: rgba(0, 0, 0, 1)">align: center;
font</span>-<span style="color: rgba(0, 0, 0, 1)">size: 50rpx;
font</span>-<span style="color: rgba(0, 0, 0, 1)">weight: bold;
width: 220rpx;
color: #17233d;
}
.btn</span>-<span style="color: rgba(0, 0, 0, 1)">pay {
margin</span>-<span style="color: rgba(0, 0, 0, 1)">top: 100rpx;
padding: 14rpx 100rpx;
line</span>-height: <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.5em;
font</span>-<span style="color: rgba(0, 0, 0, 1)">size: 36rpx;
background: #5cadff;
color: #fff;
}
.btn</span>-<span style="color: rgba(0, 0, 0, 1)">pay::after {
border: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<p>index.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Page({
data: {
price: </span><span style="color: rgba(128, 0, 128, 1)">0.01</span><span style="color: rgba(0, 0, 0, 1)">
},
onInput(</span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.setData({ price: <span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.detail.value });
},
pay() {
</span><span style="color: rgba(0, 0, 255, 1)">const</span> price = parseFloat(<span style="color: rgba(0, 0, 255, 1)">this</span>.data.price).toFixed(<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
wx.showLoading({
title: </span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">
});
wx.cloud.callFunction({
name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">pay</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用pay函数</span>
data: { price }, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 支付金额</span>
success: (res) =><span style="color: rgba(0, 0, 0, 1)"> {
wx.hideLoading();
</span><span style="color: rgba(0, 0, 255, 1)">const</span> { result } =<span style="color: rgba(0, 0, 0, 1)"> res;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> { code, data } =<span style="color: rgba(0, 0, 0, 1)"> result;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (code !== <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">) {
wx.showModal({
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">提示</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
content: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">支付失败</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
showCancel: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
});
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
}
console.log(data);
wx.requestPayment({
timeStamp: data.time_stamp,
nonceStr: data.nonce_str,
package: `prepay_id</span>=<span style="color: rgba(0, 0, 0, 1)">${data.prepay_id}`,
signType: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MD5</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
paySign: data.sign,
success: () </span>=><span style="color: rgba(0, 0, 0, 1)"> {
wx.showToast({title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">支付成功</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">});
}
});
},
fail: (res) </span>=><span style="color: rgba(0, 0, 0, 1)"> {
wx.hideLoading();
console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">FAIL</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
console.log(res);
}
});
}
});</span></pre>
</div>
<p>最终效果:页面显示0.01元和pay按钮。</p>
<p> </p>
<p><span style="color: rgba(255, 0, 0, 1)">补充:</span>参考https://www.jianshu.com/p/bd96741287a8和https://blog.csdn.net/gf771115/article/details/100917779</p>
<p>还可以使用https://github.com/befinal/node-tenpay</p>
<p><span style="color: rgba(255, 0, 0, 1)">还有</span>:https://developers.weixin.qq.com/community/develop/article/doc/0004c4a50a03107eaa79f03cc56c13</p>
<p> </p>
<p>参考:</p>
<p>https://juejin.im/post/5c876108e51d45543d2836e4</p>
<p>https://cloud.tencent.com/edu/learning/course-100005-1276</p>
<p>关于微信小程序认证问题 https://blog.csdn.net/forthejoker/article/details/79654610</p>
<p>下载github项目的一个方法 https://blog.csdn.net/qq_35433926/article/details/89415895</p>
<p>支付官方文档 https://pay.weixin.qq.com/wiki/doc/api/index.html</p>
<p>https://www.jianshu.com/p/bd96741287a8</p><br><br>
来源:https://www.cnblogs.com/pu369/p/11338016.html
頁:
[1]