幾行代碼實現小程序雲開發提現功能
- 2019 年 10 月 6 日
- 筆記
先看效果:

純雲開發實現,下面說使用步驟: 一:開通商戶的企業付款到領取功能 說明地址:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
使用條件
1、商戶號(或同主體其他非服務商商戶號)已入駐90日
2、截止今日回推30天,商戶號(或同主體其他非服務商商戶號)連續不間斷保持有交易
使用條件是第一難,第二難在下面這裡

在網上找了很多,感覺是雲開發這裡的一個不完善地方,如果不填ip,會報這種錯
{"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"NO_AUTH"}
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[此IP地址不允許調用接口,如有需要請登錄微信支付商戶平台更改配置]]></return_msg>
<mch_appid><![CDATA[wx383426ad9ffe1111]]></mch_appid>
<mchid><![CDATA[1536581111]]></mchid>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[NO_AUTH]]></err_code>
<err_code_des><![CDATA[此IP地址不允許調用接口,如有需要請登錄微信支付商戶平台更改配置]]></err_code_des>
</xml>
雲開發沒有ip這個概念,所以這裡有些無從下手,希望後期雲開發能有更好支付方案吧,不過這裡我採用了個替代方案,參考了社區帖子:
https://developers.weixin.qq.com/community/develop/doc/00088cff3a40d87d80f7267b65b800
之後我也親自驗證了,基本上就是這幾個,當然肯定不夠,但是可以自己在邏輯上進行處理,ip以下:
172.81.207.12 172.81.212.74 172.81.236.99 172.81.235.12 172.81.245.51 212.64.65.131 212.64.84.22 212.64.85.35 212.64.85.139 212.64.87.134
接着,可以動手了
二、雲開發部分
1、設置雲存儲
證書配置地址:

下載後有三個文件,我們只需要p12結尾的那個

然後,將這個apiclient_cert.p12文件上傳到你的雲存儲

這裡處理完了,我們只需要一個東西,就是fileID也就是常說的雲存儲ID(上圖紅框內容)
2、配置雲函數
新建雲函數ref雲函數

代碼如下:
const config = { appid: 'wx383426ad9ffe1111', //小程序Appid envName: 'zf-shcud', // 小程序雲開發環境ID mchid: '1111111111', //商戶號 partnerKey: '1111111111111111111111', //此處填服務商密鑰 pfx: '', //證書初始化 fileID: 'cloud://zf-shcud.11111111111111111/apiclient_cert.p12' //證書雲存儲id }; const cloud = require('wx-server-sdk') cloud.init({ env: config.envName }) const db = cloud.database(); const tenpay = require('tenpay'); //支付核心模塊 exports.main = async(event, context) => { //首先獲取證書文件 const res = await cloud.downloadFile({ fileID: config.fileID, }) config.pfx = res.fileContent let pay = new tenpay(config,true) let result = await pay.transfers({ //這部分參數含義參考https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 partner_trade_no: 'bookreflect' + Date.now() + event.num, openid: event.userinfo._openid, check_name: 'NO_CHECK', amount: parseInt(event.num) * 100, desc: '二手書小程序提現', }); if (result.result_code == 'SUCCESS') { //如果提現成功後的操作 //以下是進行餘額計算 let re=await db.collection('user').doc(event.userinfo._id).update({ data: { parse: event.userinfo.parse - parseInt(event.num) } }); return re } }
需安裝的依賴:wx-server-sdk、tenpay
這裡只是實現了簡單原始的提現操作,關於提現後,比如防止重複提交,提現限額這些,在開源二手書商城上有完整流程,地址:
https://github.com/xuhuai66/used-book-pro
這種辦法,不是每次都能成功提現,小概率遇到ip未在白名單情況,還是希望,雲開發團隊能儘快出一個更好的解決方案吧