微信小程序-云支付那些事儿

代码 代码 1683 人阅读 | 0 人回复

<
目次



1、媒介

略微玩过微疑小法式云开辟的同窗皆根本明白微疑小法式云开辟如今曾经撑持云付出那一才能。
那末正在云付出的才能撑持之下,全部付出的流程是如何的呢?
比方:用户倡议付出前、付出中、付出后的逻辑处理惩罚该当是如何的,该怎样设想会比力保险,低落出错的几率。
那末本文次要引见云付出的利用和正在云付出下的定单体系、付出流程该怎样设想。
趁便提一下:微疑付出功用仅撑持企业主体挪用
2、思绪阐发

云付出的挪用流程大抵分为以下四步:
1、获得免鉴权参数
小法式端传进金额、商品疑息等根本参数后,挪用云函数获得免鉴权参数。
2、将免鉴权参数传进小法式真个付出API
云函数返回免鉴权参数,做为小法式端付出API的进参。
3、用户付出
调起微疑付出,用户举办付出/打消付出操纵
4、微疑端回调指定的云函数
付出胜利后回调此云函数。
假如用户打消付出,则没有会回调此云函数。
那末,按照以上四个步调就能够阐发出,定单的创立、定单付出形态的改动该当是正在甚么工夫了。
定单的创立该当是正在第一步的获得免鉴权参数的工夫,获得免鉴权参数后将定单号等疑息插进数据库。
此时的定单付出形态该当是待付出形态。
同时也能够明白,定单付出形态的改动,该当是正在第四步中来举办改动,假如付出胜利,将定单的付出形态改成付出胜利便可。
相干的民圆文档链接:
云付出文档
云付出回调文档
小法式端调起付出API文档
3、云付出小案例

1.云函数

1-1.获得免鉴权参数云函数(wxPay)

此云函数次要是获得付出API所需的参数,和创立定单插进数据库。
胜利挪用示例结果截图
094617q35ld3ql55nd1bj3.jpg

完成代码
  1. // 云函数进口文件
  2. const cloud = require(&#39;wx-server-sdk&#39;)
  3. cloud.init({
  4.   env: cloud.DYNAMIC_CURRENT_ENV
  5. })
  6. const db = cloud.database()
  7. exports.main = async (event) => {
  8.   const wxContent = cloud.getWXContext() // openid等疑息
  9.   const openid = wxContent.OPENID
  10.   const appid = wxContent.APPID
  11.   const totalFee = event.totalFee // 付出金额(单元:分)
  12.   const body = event.body // 商品名
  13.   const outTradeNo = createOutTradeNo() // 定单号
  14.   // 获得免鉴权付出参数
  15.   const payMent = await cloud.cloudPay.unifiedOrder({
  16.     "body": body,
  17.     "outTradeNo": outTradeNo,
  18.     "spbillCreateIp": "127.0.0.1",
  19.     "subMchId": "商户号", // 商户号
  20.     "totalFee": totalFee,
  21.     "envId": "对应的云情况id", // 云情况id
  22.     "functionName": "payCallBack" // 付出回调云函数
  23.   })
  24.   // 创立定单
  25.   const nowTime = new Date().getTime()
  26.   const orderObj = {
  27.     _openid: openid,
  28.     appid: appid,
  29.     outTradeNo: outTradeNo,
  30.     totalFee: totalFee * 0.01,
  31.     payStatus: &#39;wait&#39;,
  32.     createTime: nowTime,
  33.     updateTime: nowTime,
  34.     deleteTime: null,
  35.   }
  36.   await addOrder(orderObj)
  37.   return payMent
  38. }
  39. /** 创立随机的独一定单号(32位) */
  40. const createOutTradeNo = () => {
  41.   let outTradeNo = new Date().getTime() // 获得当前13位工夫戳
  42.   let numStr = &#39;0123456789&#39;;
  43.   let randomStr = &#39;&#39;;
  44.   for (let i = (32 - 13); i > 0; --i) {
  45.     randomStr += numStr[Math.floor(Math.random() * numStr.length)];
  46.   }
  47.   outTradeNo += randomStr
  48.   return outTradeNo
  49. }
  50. /** 背数据库创立定单 */
  51. const addOrder = async (orderObj) => {
  52.   return await db.collection(&#39;order&#39;)
  53.     .add({
  54.       data: orderObj
  55.     })
  56.     .then(res => {
  57.       console.log("创立定单胜利 =====>", res, orderObj)
  58.     })
  59.     .catch(err => {
  60.       console.log("创立定单非常 =====>", err, orderObj)
  61.     })
  62. }
复造代码
1-2.付出回调云函数(payCallBack)

正在用户付出胜利后微服气务端将会挪用此云函数,并照顾付出圆的定单号、openid、appid等疑息。
开辟者能够按照那个去判定当前回调的是哪一个定单。
回调文档
胜利回调结果示例截图
094618pkdhka1x38m6h928.jpg

完成代码
  1. // 云函数进口文件
  2. const cloud = require(&#39;wx-server-sdk&#39;)
  3. cloud.init({
  4.   env: cloud.DYNAMIC_CURRENT_ENV
  5. })
  6. const db = cloud.database()
  7. // 云函数进口函数
  8. exports.main = async (event) => {
  9.   console.log("回调返回工具 =====>", event)
  10.         // 判定前提
  11.   if (event.returnCode == &#39;SUCCESS&#39;) {
  12.     if (event.resultCode == &#39;SUCCESS&#39;) {
  13.       // 查询前提
  14.       const whereObj = {
  15.         appid: event.subAppid, // 小法式的APPID
  16.         _openid: event.subOpenid, // 小法式用户的openid
  17.         outTradeNo: event.outTradeNo, // 商户号的定单号
  18.       }
  19.       // 更新工具
  20.       const updateObj = {
  21.         transactionId: event.transactionId, // 微疑圆的定单号
  22.         totalFee: event.totalFee * 0.01, // 微疑圆支到的金额
  23.         timeEnd: event.timeEnd, // 付出完毕工夫
  24.         payStatus: &#39;success&#39;,
  25.         updateTime: new Date().getTime()
  26.       }
  27.       // 更新定单
  28.       await updateOrder(whereObj, updateObj)
  29.     }
  30.   }
  31.   // 付出回调的返回和谈战进参和谈(必需返回此构造体,详睹文档)
  32.   return {
  33.     errcode: 0,
  34.     errmsg: event.resultCode
  35.   }
  36. }
  37. /** 更新定单的付出形态 */
  38. const updateOrder = async (whereObj, updateObj) => {
  39.   return await db.collection(&#39;order&#39;)
  40.     .where(whereObj)
  41.     .update({
  42.       data: updateObj
  43.     })
  44. }
复造代码
2.小法式端(js代码)

  1. // pages/wxPay/wxPay.js
  2. Page({
  3.   /**
  4.    * 页里的初初数据
  5.    */
  6.   data: {
  7.   },
  8.   /**
  9.    * 性命周期函数--监听页里减载
  10.    */
  11.   onLoad() {},
  12.   /**
  13.    * 性命周期函数--监听页里显现
  14.    */
  15.   onShow() {},
  16.   /** 付出面击监听 */
  17.   async payTap() {
  18.     const totalFee = 2
  19.     const body = &#39;付出测试&#39;
  20.     wx.showLoading({
  21.       title: &#39;调起微疑付出中&#39;,
  22.       mask: true
  23.     })
  24.     // 获得付出免鉴权参数
  25.     const payMentRes = await this.getPayMent(totalFee, body)
  26.     wx.hideLoading({
  27.       success: (res) => {},
  28.     })
  29.     // 小法式付出API
  30.     const payRes = await this.wxPay(payMentRes.result.payment)
  31.     // 付出API返回成果挨印
  32.     console.log(payRes)
  33.   },
  34.   /**
  35.    * 小法式付出API
  36.    * @param {object} payment 付出免鉴权参数
  37.    */
  38.   wxPay(payment) {
  39.     return new Promise((resolve, rejects) => {
  40.       wx.requestPayment({
  41.         ...payment,
  42.         success(res) {
  43.           resolve({
  44.             status: &#39;success&#39;,
  45.             res: res
  46.           })
  47.         },
  48.         fail(err) {
  49.           resolve({
  50.             status: &#39;fail&#39;,
  51.             res: err
  52.           })
  53.         }
  54.       })
  55.     })
  56.   },
  57.   /**
  58.    * 获得付出免鉴权参数
  59.    * @param {number} totalFee 付出金额, 单元:分
  60.    * @param {string} body 商品称号
  61.    */
  62.   getPayMent(totalFee, body) {
  63.     return new Promise((resolve, rejects) => {
  64.       wx.cloud.callFunction({
  65.         name: &#39;wxPay&#39;,
  66.         data: {
  67.           totalFee,
  68.           body
  69.         },
  70.         success(res) {
  71.           resolve(res)
  72.         },
  73.         fail(err) {
  74.           resolve(err)
  75.         }
  76.       })
  77.     })
  78.   },
  79. })
复造代码
3.付出结果

用户端
094618w96u5kmk5hah7ki6.jpg

商家端
094619qska5mo3996kk39t.jpg

4、代码目次构造

094619uspjqpcegsgssjzh.jpg

4、为何如许写

大要有的同窗也利用过微疑云付出的才能,可是未曾利用到上里道到的付出回调云函数。
可是也能够做到获得用户的付出结果。
以下图
094619xk0fmxa0kivaa08x.jpg

究竟上,小法式真个付出API(wx.requestPayment())也能够返回当前的付出结果。也的确可使用那个回调的结果去判定付出能否胜利。
那既然如许,为何借要节外生枝写个付出回调云函数去获得付出的结果呢?
看到那里也阐明您看完了全部完成历程了,假如您无为甚么要用这类方法完成的疑问,也该当几能够大要本人给本人找到一些谜底。
裁撤开辟标准、劣化相干的小成绩,我那里道一个很致命的缘故原由。
微疑小法式付出API(wx.requestPayment())正在IOS端有一个致命的成绩,
当用户付出后会进进上面那个页里
094620ja6z2cvbvkcbqnqe.jpg

当用户没有面击完成按钮,微疑小法式的付出API(wx.requestPayment())回调是没有会触收的。
也便道,小法式本身拿没有到用户的付出结果了。
假定用户间接退出了微疑,小法式也便烧毁了。这时候,定单形态该怎样改动呢?
tips: 正在安卓端没有会呈现那个成绩。有爱好的同窗能够本人来理论以下。
5、结语

思绪是如许的,可是一些非常处理惩罚,需求开辟者正在开辟过程当中自止处理惩罚,比方定单插进失利、更新失利等非常成绩。固然几率没有年夜,并且也有挨印挪用纪录,假如呈现成绩,也是能够查到挪用纪录和相干疑息。
有任何疑问能够正在攻讦区留下。我每天城市举办再起,公聊没有回。(为了刷积分)
以上均是自己开辟过程当中的一些经历总结取贯通,假如有甚么没有准确的处所,祈望年夜佬们攻讦区示正。


免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则