前言

欢迎大佬指正思路。

由于最近面试时,被问到了这种问题,但是我回答的含糊不清。
虽然以前做过这些功能,但是一直都没有去总结和记录,所以我决定回顾一下并记录下来。

此支付为 v2 。

只记录思路

正文

uniapp

首先,默认已经准备好小程序 appid 等相关内容。

<template><view><view @click="pay">支付<view></view>
</template>
<script>
export default {methods: {pay() {uni.request({url: '192.168.1.99:1234/api/pay',method: 'POST',data: { total_fee: 100 }, // 传入支付金额header: { Authorization: uni.getStorageSync('token') },  // 这里假设已经获取到用户凭证的 openid,并存入数据库,token中记录对应表idsuccess: (res) => {uni.requestPayment({"timeStamp": res.data.result.timeStamp,"nonceStr": res.data.result.nonceStr,"package": res.data.result.package,"signType": "MD5","paySign": res.data.result.paySign,success: (res) => {}, // 支付成功fail: (err) => {},   // 支付失败})},fail: (err) => {}})}}
}
</script>

后端

后端使用 nodejs(koa) 框架

const koaRequest = require('request');    // 这里使用 request 发送请求
const stringRandom = require('string-random');   // 使用 string-random 生成随机数
const crypto = require('crypto');    // 使用 crypto 进行 md5 加密
const xml2js = require('xml2js');    // 使用 xml2js 解析 xmlasync pay(ctx, next) {const { total_fee } = ctx.request.body    // 结构出 金额const { id } = ctx.token.datas    // 从 token 中解析出 idtry {const { openid } = await inquire(id) // ... 这里通过 id 查出用户 openidconst random = (stringRandom(32, { letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' }))  // 生成随机数const transactions = "wx_" + (new Date().getFullYear()) + (new Date().getMonth() + 1) + (new Date().getDate()) + (new Date().getHours()) + (new Date().getMinutes()) + (new Date().getSeconds()) + (new Date().getMilliseconds())    // 生成订单号let payParams = {appid: 'wx1234564789465465',    // 申请的微信小程序appidsecret: 'q1w2e3r4t5y6u7i8o9p',    // 申请的微信小程序keynonce_str: random,    // 随机数body: '测试', // 商品描述out_trade_no: transactions,  // 订单号total_fee,    // 金额spbill_create_ip: '101.101.101.101', // 终端ipnotify_url: 'https://xxx.xxx.xxx:1234/api/callback',   // 支付成功后的回调地址trade_type: "JSAPI", // 支付模式sub_openid: openid   // 用户的 openid}let str = MSign(payParams)   // 排序并将数据加密 MD5let postData = ''let keys = Object.keys(payParams).sort()    // 对数据排序// 转为 XML数据keys.map((p) => {postData += `<${p}><![CDATA[${payParams[p]}]]></${p}>`})postData += `<sign>${str}</sign>`postData = `<xml>${postData}</xml>`const resXml = await wechatpay(postData)let { prepay_id } = resXml// 签名let timestamp = parseInt(new Date().getTime()) + '';let finalsign =  {appId: "wx1234564789465465", // 对应 appidtimeStamp: timestamp,nonceStr: random,package: 'prepay_id=' + prepay_id,signType: "MD5"}let pxstr = MSign(finalsign)  // 加密// 客户端最后使用数据let clientParam = {timeStamp: timestamp,nonceStr: random,package: 'prepay_id=' + prepay_id,signType: "MD5",paySign: pxstr}ctx.body = { // 返回需要的支付数据code: "0",message: "支付",result: clientParam}} catch (err) {}
}// 支付成功后的回调,必须以固定格式返回给微信,不然微信会一直发请求
async callback(ctx, next) {let res = ctx.request.bodytry {const success = "<xml><return_code>" + res.xml.return_code + "</return_code></xml>"ctx.body = success// ... 其他业务逻辑} catch (err) {}
}// MD5加密
function MSign(req) {// 排序let keys = Object.keys(req).sort();// 拼接字符串let str = "";keys.map((p) => {str += `${p}=${req[p]}&`;})str += "key=xxxxxxxxxxxxxxxxxxxxxx";    // 申请支付的 keyreturn str = crypto.createHash('md5').update(str).digest('hex').toUpperCase()
}// 支付签名
const wechatpay = (xml) => {return new Promise((resolve,reject)=>{// 这里用了reques库koaRequest({url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',   // 微信支付前面的 apimethod:'POST',body: xml}, (err, res, body) => {if (err) reject(err)resolve(parseXml(body).xml)})});
}// 解析xml
const parseXml = (xml) =>{let { parseString } = xml2js;let res;parseString(xml,  {trim: true,explicitArray: false}, function (err, result) {res = result;});return res;
}

uniapp 微信支付功能相关推荐

  1. uniapp小程序微信支付功能

    目录 字段说明 前置工作 获取openid 微信支付 报错问题 uniapp 开发小程序需要实现微信支付功能,下面对相关业务进行说明. 字段说明 AppID:小程序的身份证,微信客户端用来确认你的小程 ...

  2. uni-app - 最详细 H5 网页接入微信支付功能,提供从详细的示例代码与注释(移动端网页实现微信支付能力,微信公众号前端支付 JSAPI / JS-SDK 详细示例源码)官方最新超级详细教程

    前言 关于 uni-app 项目中接入微信支付的文章鱼龙混杂,各种 JSAPI / JS-SDK 乱代码.过时.没注释.不讲流程原理,非常难用. 本文实现了 uni-app H5 移动端网页项目,实现 ...

  3. 微信小程序-JAVA实现微信支付功能(微信支付2.0)

    微信小程序-JAVA实现微信支付功能(微信支付2.0) 一.前言 本博客主要介绍JAVA后台与微信小程序(UNI-APP或者原生微信小程序)的微信支付的实现,如果是APP或者H5的开发暂时不支持,具体 ...

  4. uniapp实现支付功能

    uniapp实现支付功能 详细参考: https://gitee.com/copperpeas/uniapp-payment uniapp-payment 介绍 uniapp支付 微信支付流程 测试接 ...

  5. 微信小程序中嵌套html_微信小程序:web-view嵌套H5实现微信支付功能解决方案及填坑...

    ab7117c7d4947210c39e126a01d23ede.jpg 最近一个多月加班比较严重,偶尔休息一天也是在补睡眠+陪家人,比较长时间没有来进行总结记录了.今天不加班,开始为这段时间做的东西 ...

  6. 微信公众号开发,微信支付功能开发(网页JSAPI调用)

    1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...

  7. 如何使用easywechat开发微信支付功能

    easywechat是神一样的存在.非常好用.希望大家都能转到这上面来. 用easywechat来开发微信支付功能,步骤如下: 一,需要有一个商品下单页面,页面上有你的商品的信息,还要有购买数量,和一 ...

  8. 【javaWeb微服务架构项目——乐优商城day15】——会调用订单系统接口,实现订单结算功能,实现微信支付功能

    0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 源码笔记及资料: 链接:https://pan.baidu.com/s/1_opfL63P1pzH3rzLnbFiNw 提取码:v ...

  9. 尚医通项目150-170:预约挂号、微信支付功能

    前台用户系统 预约挂号 1.接口分析 (1)根据预约周期,展示可预约日期数据,按分页展示 (2)选择日期展示当天可预约列表(该接口后台已经实现过) 2.页面展示分析 (1)分页展示可预约日期,根据有号 ...

  10. 企业微信支付功能怎么开通?

    企业微信接入了微信支付,形成了企业支付功能,通过此功能,企业管理员可以以企业的名义给员工发送红包.对员工进行付款或收款. 前言 企业微信接入了微信支付,形成了企业支付功能,通过此功能,企业管理员可以以 ...

最新文章

  1. 柯西不是你 - 杨宗纬
  2. oracle中生成大批量数据的方法-下
  3. 【干货】搭建社区运营团队的一些经验和“血的教训”
  4. comsol如何设置距离梯度_使用 COMSOL 软件求解经典 CFD 基准问题:顶盖驱动空腔...
  5. linux系统常见操作,Linux系统基本操作
  6. 复练-软考网规-机房建设规范专题
  7. java浮点数转二进制_浮点数转换成二进制
  8. Android像素密度dpi/ppi计算公式,px、sp、dp互转工具类——概念解释
  9. 对 Unity 动画系统 Mecanim 的调研
  10. ioi 赛制_如何评价 IOI 2017(国际信息学奥林匹克竞赛)?
  11. 删除后别人的微信号变成wxid_怎么恢复删除的微信好友?教程在手,不怕恢复不了!_...
  12. Excel中常用技巧
  13. Vue:解决[Vue warn]: Failed to resolve directive: modle (found in Anonymous)
  14. sklearn模块之朴素贝叶斯:(二)伯努利模型的实现
  15. 发现一个国外的学习网站
  16. 区块链应用场景:物联网和物流供应链
  17. python播放音乐同步歌词范晓萱_同步_范晓萱_高音质在线试听_同步歌词|歌曲下载_酷狗音乐...
  18. 抄板PCB,好麻烦!
  19. It's a test
  20. 查找图形图斑中的空洞

热门文章

  1. 史蒂夫·保罗·乔布斯
  2. 破解PDF打开密码、复制限制
  3. 阿里云STMP实现邮件发送
  4. 基于PHP的定时交作业系统
  5. MSSQL2005的新功能创建数据库快照
  6. 2023年天津农学院专升本停招专业的备考建议?
  7. C#窗体设计中InitializeComponent的用法
  8. linux 配置局域网内部www服务器,局域网内部邮件服务器搭建方法
  9. 网页外挂技术浅谈(入门篇)
  10. win2003 Enterprise Edition sp2 企业版序列号