实战:云开发·实现在线充值小程序

2020-5-3

文章编号:007/100

以前很少写文章。从今天开始我要挑战一下自己,连续输出100篇技术类文章。这100篇文章我尽量以实战案例为主。

如果你觉得本文还不错,记得关注或者给个 star,你们的赞和star是我编写更多更精彩文章的动力!
GitHub 地址

serverless 在小程序上体现的淋漓尽致,开发体验太爽了。我发现用云开发实现微信支付更为简单!

如果你也想学习小程序支付,但是有没有商户号。我的商户号可以借你用用,反正里面也没钱。我 wx: guzhan321 备注 小程序

本文重点内容

  • 小程序布局
  • 云函数实现统一下单接口
  • 功能测试

成品演示

demo_007_1.gif

关键技术点

  • 小程序调用统一下单接口

内容大纲

  • 创建小程序
  • 页面布局
  • 实现云函数接口
  • 页面联调

开始撸代码

创建小程序

使用最新版的微信开发者工具,创建小程序时默认会使用云开发模板。
demo_007_2.png
刚创建好的云开发模板就是这样的,默认的模板已经实现了一些功能。所以有些是要删除的
demo_07_3.png

页面布局

打开 index 页面,实现基本的页面布局,需要将原来的代码删掉。
目录:/miniprogram/pages/index/index.wxml
<!--index.wxml-->
<view class="container">

<input class="phone" value="{{phone}}" placeholder="请输入手机号" />

<view class="money" >
  <view><button bindtap="pay" type="primary" data-money="0.01" >0.01</button></view>
  <view><button bindtap="pay" type="primary" data-money="0.02" >0.02</button></view>
  <view><button bindtap="pay" type="primary" data-money="0.03" >0.03</button></view>
</view>
<view class="money" >
  <view><button bindtap="pay" type="primary" data-money="0.04" >0.04</button></view>
  <view><button bindtap="pay" type="primary" data-money="0.05" >0.05</button></view>
  <view><button bindtap="pay" type="primary" data-money="0.06" >0.06</button></view>
</view>
  <view>
    这是一个测试版,并没有实际功能
  </view>
</view>

修改样式
目录:/miniprogram/pages/index/index.wxml

/**index.wxss**/
page {
  background: #f6f6f6;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
}
.phone{
  width: 95vw;
  height: 100rpx;
  font-size: 70rpx;
  border-bottom: 1px solid green;
  margin-bottom: 15rpx;
  margin-top: 100rpx;
}
.money{
  width: 95vw;
  display: flex;
  flex-direction: row;
}
.money view{
  flex: 1;
  display: flex;
  flex-direction: row;
  padding: 5rpx;
}
.money view button{
  flex: 1;
  width: auto;
}
这个时候,页面已经渲染出来了

实现云函数接口

  • 创建云函数

      右键点击 cloudfunctions 文件夹,选择新建 Node.js 云函数,输入 pay 然后按下回车键
    
  • 安装依赖

      在 pay/package.json 文件中的 dependencies 字段下新增一行 "tenpay": "^2.1.18"
    
      右键点击 pay 文件夹,选择在终端打开。然后在终端输入 npm i
    
  • 开始编写接口

      打开 pay/index.js 开始编写 支付接口
    
// 云函数入口文件
const cloud = require('wx-server-sdk')
const tenpay = require('tenpay')

const config = {
  appid: 'wxf25e232c63a1111a', // 小程序 appid
  mchid: '1515679431',  // 商户号
  partnerKey: '3a816922aba3ee43a8920024b9444996',  // api 秘钥
  notify_url: 'https://www.qq.com/',  
  spbill_create_ip: '127.0.0.1'
}

const wxApi = new tenpay(config)

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
  const { money } = event
  const wxContext = cloud.getWXContext()
  let out_trade_no = Date.now() + '_' + parseInt(Math.random() * 1e5)
  let result = await wxApi.getPayParams({
    out_trade_no: out_trade_no,
    body: '模拟充值',
    total_fee: money,
    openid: wxContext.OPENID
  });
  
  return {
    payParams: result
  }
}
  • 提交云函数

      右键点击 pay 文件夹,选择 上传并部署:所有文件
    

页面联调

  • 新增 js 事件
//pages/index/index.js
const app = getApp()

Page({
  data: {
    phone: '15021134415',
  },
  pay: async (e) => {
    try {
      const { money } = e.currentTarget.dataset
      console.log('调用支付', money)
      wx.cloud.callFunction({
        name: 'pay',
        data: {
          money: parseFloat(money) * 100 + ''
        },
        success: (data) => {
          const { payParams } = data.result
          wx.requestPayment({
            nonceStr: payParams.nonceStr,
            package: payParams.package,
            paySign: payParams.paySign,
            timeStamp : payParams.timeStamp,
            signType : 'MD5',
            success: () => {
              wx.showToast({
                title: '支付成功'
              })
              wx.showShareMenu({
                withShareTicket: true,
                complete: (res) => {},
              })
            },
            fail: (err) => {
              wx.showToast({
                title: '支付失败',
                icon: 'none'
              })
              console.log(err)
            }
          })
        }
      })
    } catch (error) {
    }
  }
})
  • 调试:点击预览,微信扫描二维码即可在手机上调试

总结

云开发 serverless 模式一定会在不久的将来大行其道,因为开发周期和开发成本都会降低很多。并且前端开发人员很容易就能上手为全站工程师。

下一篇文章:taro + 云开发 实现奶茶店小程序

如果你也想学习小程序支付,但是有没有商户号。我的商户号可以借你用用,反正里面也没钱。我 wx: guzhan321 备注 小程序


demo_07_3.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355