小程序微信支付流程(商城余额支付,优惠券支付,积分抵消,微信支付)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

在这里插入图片描述

小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。

看不懂吗?不急,听我慢慢解释,这个业务流程大致就是首先你得先在小程序的代码中调用wx.login()来向微信获取到code,拿到了之后把code通过request传给商户服务器,再由商户服务器通过骚操作来跟微信服务器要session_key和openID。

代码如下(小程序端):

getToken: function () {

//调用登录接口

wx.login({

success: function (res) {

var code = res.code;

wx.request({

url: “商户服务器登陆url”,

data: {

code: code

},

method: ‘POST’,

success: function (res) {

wx.setStorageSync(‘token’, res.data.token); //存在小程序缓存中

},

fail: function (res) {

console.log(res.data);

}

})

}

})

}

调用这几行代码就可以向跟微信服务器要code,并且将code传到商户服务器中,记住这里最好使用post发送请求,安全性的东西我应该不用讲了,因为避免其他人滥用接口,于是我们使用token来进行验证。并将商户服务器返回的token存在小程序缓存中。

那么服务器端应该怎么做呢?

我门通过小程序提交的code,和小程序的APPID以及APPSECRET和拼接下列的url,并用url进行get请求。

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

返回的数据是一个json对象,我门通过使用json_decode(JSON,true)解析为数组,数据包括用户的openID以及session_key,获取到了后我们应该将openID存入数据库中,它代表着用户的身份,那么令牌应该怎么生成呢。

二.token的生成以及缓存

我们根据一个用户表将id和openid联系起来,对应openID的id则是用户的uid,我们可以这么封装

//要缓存的数据数组

$cacheValue = $result; //包含openID和session_key

c a c h e V a l u e [ ′ u i d ′ ] = cacheValue['uid'] = cacheValue[uid]=uid; //用户id

$cacheValue[‘scope’] =ScopeEnum::User; //用户权限级别

缓存的方式我们可以选择redis,memcache, 文件缓存等等,采用键值对(key-value)的方式进行存储,记得设置好过期时间。这里的key我们用token来赋值,token可以通过这样的方式进行生成:

//获取32位随机字符串

$str = getRandChar(32); //自定义方法生成32位随机串

//三组字符串进行md5加密

t i m e S t a m p = timeStamp = timeStamp=_SERVER[‘REQUEST_TIME_FLOAT’];

//salt

$salt = config(‘secure.token_salt’); //随机字符串

//返回token

return md5( s t r . str. str.timeStamp.$salt);

这种算法基本保障了token的唯一性。因为值是我们获取到的openID和session_key所在的数组,所以需要将数组转成json才能存进去。以后的代码当我们需要openID或者uid等时可以直接通过取缓存的方式来取。

三,调用统一下单接口,获取prepay_id,再次签名(后端完成,不详解)

在这里插入图片描述

  1. 点击‘提交订单’按钮,创建订单,清空购物车,完成支付

<van-submit-bar

price=“{{ allGoodsAndYunPrice*100 }}”

suffix-label=“+{{totalScoreToPay}} 积分”

button-text=“提交订单”

bind:submit=“goCreateOrder”

/>

  1. 创建订单,清空购物车,调用支付函数

const wxpay = require(‘…/…/utils/pay.js’)’

//去创建订单

goCreateOrder(){

//检测实名认证状态

//创建订单

this.createOrder(true)

}

//创建订单

createOrder(){

var that = this;

var loginToken = wx.getStorageSync(‘token’) // 用户登录 token

var remark = this.data.remark; // 备注信息

let postData = { //创建订单需要的参数

token: loginToken,//token

goodsJsonStr: that.data.goodsJsonStr, //购买的商品数据列表

remark: remark,//备注信息

peisongType: that.data.peisongType// // 配送方式 kd,zq 分别表示快递/到店自取

};

//调用创建订单接口,传递此次订单相关数据

WXAPI.orderCreate(postData).then(function (res) {

that.data.pageIsEnd = true

if (res.code != 0) {

that.data.pageIsEnd = false

wx.showModal({

title: ‘错误’,

content: res.msg,

showCancel: false

})

return;

}

if (“buyNow” != that.data.orderType) { //订单类型,购物车下单或立即支付下单,默认是购物车,

// 清空购物车数据

WXAPI.shippingCarInfoRemoveAll(loginToken)

}

that.setData({

totalScoreToPay: res.data.score, //积分

isNeedLogistics: res.data.isNeedLogistics, 是否需要物流信息

allGoodsAndYunPrice: res.data.amountReal,//总价=总商品价+总运费

yunPrice: res.data.amountLogistics,//运费

hasNoCoupons,//没有优惠券

coupons,//优惠券

couponAmount: res.data.couponAmount //优惠金额

});

that.data.pageIsEnd = false

return;

}

//创建订单后的操作

that.processAfterCreateOrder(res)

})

//创建订单后的操作

async processAfterCreateOrder(res) {

// 直接弹出支付,取消支付的话,去订单列表

const balance = this.data.balance

if (balance || res.data.amountReal*1 == 0) {

// 有余额

const money = (res.data.amountReal * 1 - balance*1).toFixed(2)

if (money <= 0) {

// 余额足够

wx.showModal({

title: ‘请确认支付’,

content: 您当前可用余额¥${balance},使用余额支付¥${res.data.amountReal}?,

confirmText: “确认支付”,

cancelText: “暂不付款”,

success: res2 => {

if (res2.confirm) {

// 使用余额支付,传token,和订单id

WXAPI.orderPay(wx.getStorageSync(‘token’), res.data.id).then(res3 => {

if (res3.code != 0) {

wx.showToast({

title: res3.msg,

icon: ‘none’

})

return

}

wx.redirectTo({

url: “/pages/order-list/index”

})

})

} else {

wx.redirectTo({

url: “/pages/order-list/index”

})

}

React

  • 介绍一下react

  • React单项数据流

  • react生命周期函数和react组件的生命周期

  • react和Vue的原理,区别,亮点,作用

  • reactJs的组件交流

  • 有了解过react的虚拟DOM吗,虚拟DOM是怎么对比的呢

  • 项目里用到了react,为什么要选择react,react有哪些好处

  • 怎么获取真正的dom

  • 选择react的原因

  • react的生命周期函数

  • setState之后的流程

  • react高阶组件知道吗?

  • React的jsx,函数式编程

  • react的组件是通过什么去判断是否刷新的

  • 如何配置React-Router

  • 路由的动态加载模块

  • Redux中间件是什么东西,接受几个参数

  • redux请求中间件如何处理并发

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
act-Router

  • 路由的动态加载模块

  • Redux中间件是什么东西,接受几个参数

  • redux请求中间件如何处理并发

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-6xJzQC9C-1713584200646)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值