从零玩转系列之微信支付实战Uni-App微信授权登录和装修下单页面和搭建下单接口以及发起下单请求2

简介: 从零玩转系列之微信支付实战Uni-App微信授权登录和装修下单页面和搭建下单接口以及发起下单请求2

五、完善交互


我们将下单页面完整的展示出来了,那么我们接下里就是将列表的数据改为动态交互

剩下的API接口都是和PC端一样的可以直接copy pc端项目的api文件夹



创建api请求


商品请求

// axios 发送ajax请求
import request from '@/utils/request';
//查询商品列表
export function getProductList() {
    return request({
        url: '/api/product/productList',
        method: 'get'
    });
}


编写发送请求 获取商品列表

import { getProductList } from "../../api/product";
// 获取商品列表
const selectProductList = async () => {
    const { data } = await getProductList()
    productList.value = data
    payOrder.value.productId = data[0].id
}


编写生命周期

我们知道Vue有自己的生命周期UniApp也有,详细文档参考: https://uniapp.dcloud.net.cn/collocation/App.html#applifecycle

import { onLoad, onShow } from '@dcloudio/uni-app'
// ==========================生命周期==========================
onLoad(() => {
    // 只会加载一次
    console.log("onLoad")
    selectProductList()
})
onShow(() => {
    // 每次都会加载
})

我们列表不需要重复去请求只需要一次就行了



测试查看

有那个味道了芜湖~




六、小程序下单前置准备授权


搭建微信授权登录


模态框

<img src="https://foruda.gitee.com/images/1693410126019383931/327436ed\\_5151444.png" alt="输入图片说明" title="屏幕截图" style="zoom:50%;" />

编写变量存储用户名称和用户头像显示

// 登录授权
let modal = ref({
    show: false, // 是否显示
    content: '请点击头像和昵称填充信息获取完整的微信支付服务!',
    code: '', // 登录授权Code
    avatarUrl: 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0',
    oldAvatarUrl: 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0',
    nickName: '',// 昵称
})



编写 模态框

⚠️注意:微信在多少版本就不支持授权返回用户名称和头像了只能用户自己上传和输入昵称



登录授权获取头像

// 登录授权 - 设置头像
const onChooseAvatar = (e) => {
    console.log("onChooseAvatar", e);
    const { avatarUrl } = e.detail
    modal.value.avatarUrl = avatarUrl
    uni.setStorageSync('avatarUrl', avatarUrl)
}



登录授权获取昵称

// 登录授权 - 设置昵称
const changeName = (e) => {
    modal.value.nickName = e.detail.value
}



校验是否授权

使用生命周期 onShow 可以每次访问页面的时候触发

onShow(() => {
    // 首先去获取是否授权登录了
    const storageSync = uni.getStorageSync('token');
    const nickName = uni.getStorageSync('nickName');
    const avatarUrl = uni.getStorageSync('avatarUrl');
    // 如果没有则弹出要求授权登录
    if ([ null, undefined, '' ].includes(storageSync)) {
        modal.value.show = true
    } else {
        modal.value.nickName = nickName
        modal.value.avatarUrl = avatarUrl
    }
})



测试头像获取和昵称

将头像和昵称填写完毕将会自动弹出现授权按钮



授权提交


可以看到我们将头像和昵称填写完毕后出现了提交按钮

登录原型需求分析的时候我们解析过下单需要 OpenId


我我滴妈样式变咯



获取OPENID


流程 uniapp ---> 小程序登录授权 ---> 获取到Code码 ---> 根据Code码去后端请求获取OpenId



说明


  1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器
  2. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。



注意事项


  1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
  2. 临时登录凭证 code 只能使用一次



授权提交获取Code


下面截图当中的代码都是需要同学们自己打

Uni-app小程序授权文档: https://uniapp.dcloud.net.cn/api/plugins/login.html#login


发送请求到后端获取OpenId


修改 wechatPay.js

新增请求接口 注意 url和你自己后端一致

传递的参数是 code、nickName 昵称主要用来区分是小程序用户下单的

// 登录方法获取openId
export function loginOrRegister(data) {
    return request({
        url: '/api/wx-pay/js-api/loginOrRegister',
        method: 'post',
        data
    })
}



后端微信授权接口


小程序登录详细文档: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html

我们接收到 code 码之后直接访问微信服务器去拉授权信息


创建 WechatUniAppJsApiController

后端我就不细说了我相信都是大佬来的  😄

package com.yby6.controller;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.yby6.config.WxPayConfig;
import com.yby6.domain.wechat.LoginUser;
import com.yby6.reponse.R;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
 * 微信小程序JS API 支付
 *
 * @author Yang Shuai
 * Create By 2023/9/9
 */
@Slf4j
@RestController
@RequestMapping("/api/wx-pay/js-api")
@RequiredArgsConstructor
public class WechatUniAppJsApiController {
    private final WxPayConfig wxPayConfig;
    /**
     * 微信小程序登录接口 (登录or注册)
     *
     * @param loginUser 必填 code
     */
    @PostMapping("loginOrRegister")
    public R loginOrRegister(@RequestBody LoginUser loginUser) {
        return R.ok(getOpenId(loginUser.getCode()));
    }
    /**
     * 获取微信唯一凭证
     *
     * @param code 代码
     * @return {@link String}
     */
    private String getOpenId(String code) {
        String url = "https://api.weixin.qq.com/sns/jscode2session";
        Map<String, Object> map = new HashMap<>();
        map.put("appId", wxPayConfig.getAppid());
        map.put("secret", wxPayConfig.getSecret());
        map.put("js_code", code);
        map.put("grant_type", "authorization_code");
        String post = HttpUtil.post(url, map);
        log.info("微信返回: {}", post);
        JSONObject obj = JSONUtil.parseObj(post);
        String openid = obj.getStr("openid");
        if (StringUtils.isNoneBlank(openid)) {
            return openid;
        }
        throw new RuntimeException("临时登录凭证错误");
    }
}



测试小程序授权


启动后端程序,打开小程序清空全部缓存重新编译

将会弹出授权窗口,填写完毕后将会获取到code发送给后端获取openid


返回的OpenId 我们也存入了本地缓存当中

相关文章
|
7月前
|
JSON 监控 数据格式
1688 item_search_app 关键字搜索商品接口深度分析及 Python 实现
1688开放平台item_search_app接口专为移动端优化,支持关键词搜索、多维度筛选与排序,可获取商品详情及供应商信息,适用于货源采集、价格监控与竞品分析,助力采购决策。
|
7月前
|
缓存 监控 Android开发
京东 item_get_app 接口深度分析及 Python 实现
京东item_get_app接口可获取商品原始详情数据,包含更丰富的字段和细节,适用于电商分析、价格追踪等场景。需通过认证获取权限,支持字段筛选和区域化数据查询。
|
8月前
|
缓存 数据挖掘 API
淘宝 item_get_app 接口深度分析及 Python 实现
淘宝item_get_app接口是淘宝开放平台提供的移动端商品详情数据获取接口,相较PC端更贴近APP展示效果,支持获取APP专属价格、促销活动及详情页结构,适用于电商导购、比价工具、数据分析等场景。接口采用appkey+appsecret+session认证机制,需申请相应权限。本文提供Python调用示例及使用注意事项,帮助开发者高效对接移动端商品数据。
|
6月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1012 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
806 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
985 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
297 0
|
7月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
306 5
|
7月前
|
缓存 供应链 开发者
1688 item_get_app 接口深度分析及 Python 实现
1688平台item_get_app接口专为移动端设计,提供商品原始详情数据,包含批发价格、起订量、供应商信息等B2B特有字段,适用于采购决策、供应链分析等场景。接口需通过appkey+access_token认证,并支持字段筛选,返回结构化数据,助力企业实现智能采购与供应商评估。
|
9月前
|
移动开发 算法 安全
快应用如何去申请微信支付商户?-快应用申请微信支付-优雅草卓伊凡
快应用如何去申请微信支付商户?-快应用申请微信支付-优雅草卓伊凡
223 0
快应用如何去申请微信支付商户?-快应用申请微信支付-优雅草卓伊凡

热门文章

最新文章