md_files/自学/微信小程序.md

410 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 微信小程序
转载自黑马程序员。
## 微信小程序开发
### 介绍
小程序是一种新的开放能力,开发者可以快速地开发一个小程序。可以在微信内被便捷地获取和传播,同时具有出色的使用体验。
<img src="https://pic.bitday.top/i/2025/04/22/sg3lwd-0.png" alt="image-20221203204712437" style="zoom:50%;" />
**官方网址:**https://mp.weixin.qq.com/cgi-bin/wx?token=&lang=zh_CN
<img src="https://pic.bitday.top/i/2025/04/22/sg3tif-0.png" alt="image-20221203205305487" style="zoom:50%;" />
小程序主要运行微信内部,可通过上述网站来整体了解微信小程序的开发。
**首先,**在进行小程序开发时,需要先去注册一个小程序,在注册的时候,它实际上又分成了不同的注册的主体。我们可以以个人的身份来注册一个小程序,当然,也可以以企业政府、媒体或者其他组织的方式来注册小程序。那么,不同的主体注册小程序,最终开放的权限也是不一样的。比如以个人身份来注册小程序,是无法开通支付权限的。若要提供支付功能,必须是企业、政府或者其它组织等。所以,不同的主体注册小程序后,可开发的功能是不一样的。
<img src="https://pic.bitday.top/i/2025/04/22/sg4ecz-0.png" alt="image-20221203210640473" style="zoom:50%;" />
**然后,**微信小程序我们提供的一些开发的支持,实际上微信的官方是提供了一系列的工具来帮助开发者快速的接入
并且完成小程序的开发提供了完善的开发文档并且专门提供了一个开发者工具还提供了相应的设计指南同时也提供了一些小程序体验DEMO可以快速的体验小程序实现的功能。
<img src="https://pic.bitday.top/i/2025/04/22/sg4dy6-0.png" alt="image-20221203211226920" style="zoom:50%;" />
**最后,**开发完一个小程序要上线,也给我们提供了详细地接入流程。
<img src="https://pic.bitday.top/i/2025/04/22/sg47yt-0.png" alt="image-20221203211535565" style="zoom:50%;" />
### 准备工作
开发微信小程序之前需要做如下准备工作:
- 注册小程序
- 完善小程序信息
- 下载开发者工具
**1). 注册小程序**
注册地址https://mp.weixin.qq.com/wxopen/waregister?action=step1
<img src="https://pic.bitday.top/i/2025/04/22/sg3qwt-0.png" alt="image-20221203212348111" style="zoom: 50%;" />
**2). 完善小程序信息**
登录小程序后台https://mp.weixin.qq.com/
两种登录方式选其一即可
<img src="https://pic.bitday.top/i/2025/04/22/sg49qm-0.png" alt="image-20221203212454040" style="zoom:50%;" /> <img src="https://pic.bitday.top/i/2025/04/22/sktai8-0.png" alt="image-20221203212508081" style="zoom:50%;" />
完善小程序信息、小程序类目
<img src="https://pic.bitday.top/i/2025/04/22/sg4bya-0.png" alt="image-20221203212615981" style="zoom:50%;" />
查看小程序的 AppID与AppSecret
<img src="https://pic.bitday.top/i/2025/04/22/sg4xtx-0.png" alt="image-20221203212702993" style="zoom:50%;" />
**3). 下载开发者工具**
资料中已提供,无需下载,熟悉下载步骤即可。
下载地址: https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html
<img src="https://pic.bitday.top/i/2025/04/22/sg4tyl-0.png" alt="image-20221203212836364" style="zoom:50%;" />
扫描登录开发者工具
<img src="https://pic.bitday.top/i/2025/04/22/sg4tm8-0.png" alt="image-20221203212954956" style="zoom:50%;" />
创建小程序项目
<img src="https://pic.bitday.top/i/2025/04/22/sm2eiy-0.png" alt="image-20221203213042020" style="zoom:67%;" />
熟悉开发者工具布局
<img src="https://pic.bitday.top/i/2025/04/22/sm8s16-0.png" alt="image-20221203213108317" style="zoom:67%;" />
设置不校验合法域名
<img src="https://pic.bitday.top/i/2025/04/22/smlisf-0.png" alt="image-20221203213212370" style="zoom:67%;" />
**注:**开发阶段小程序发出请求到后端的Tomcat服务器若不勾选请求发送失败。
### 入门案例
实际上小程序的开发本质上属于前端开发主要使用JavaScript开发咱们现在的定位主要还是在后端所以对于小程序开发简单了解即可。
#### 小程序目录结构
小程序包含一个描述整体程序的 app 和多个描述各自页面的 page。一个小程序主体部分由三个文件组成必须放在项目的根目录如下
<img src="https://pic.bitday.top/i/2025/04/22/smppmq-0.png" alt="image-20221203220557676" style="zoom:67%;" />
**文件说明:**
<img src="https://pic.bitday.top/i/2025/04/22/smtcpa-0.png" alt="image-20221203220635867" style="zoom:67%;" />
**app.js**必须存在,主要存放小程序的逻辑代码
**app.json**必须存在,小程序配置文件,主要存放小程序的公共配置
**app.wxss:** 非必须存在主要存放小程序公共样式表类似于前端的CSS样式
对小程序主体三个文件了解后,其实一个小程序又有多个页面。比如说,有商品浏览页面、购物车的页面、订单支付的页面、商品的详情页面等等。那这些页面会放在哪呢?
会存放在pages目录。
每个小程序页面主要由四个文件组成:
<img src="https://pic.bitday.top/i/2025/04/22/sg395d-0.png" alt="image-20221203220826893" style="zoom:50%;" />
**文件说明:**
<img src="https://pic.bitday.top/i/2025/04/22/sg3hq4-0.png" alt="image-20221203220839187" style="zoom:50%;" />
**js文件**必须存在存放页面业务逻辑代码编写的js代码。
**wxml文件**必须存在存放页面结构主要是做页面布局页面效果展示的类似于HTML页面。
**json文件**非必须,存放页面相关的配置。
**wxss文件**非必须存放页面样式表相当于CSS文件。
#### 编写和编译小程序
**1). 编写**
进入到index.wxml编写页面布局
```xml
<view class="container">
  <view>{{msg}}</view>
  <view>
    <button type="default" bindtap="getUserInfo">获取用户信息</button>
    <image style="width: 100px;height: 100px;" src="{{avatarUrl}}"></image>
    {{nickName}}
  </view>
  <view>
    <button type="primary" bindtap="wxlogin">微信登录</button>
    授权码:{{code}}
  </view>
  <view>
    <button type="warn" bindtap="sendRequest">发送请求</button>
    响应结果:{{result}}
  </view>
</view>
```
进入到index.js编写业务逻辑代码
```javascript
Page({
  data:{
    msg:'hello world',
    avatarUrl:'',
    nickName:'',
    code:'',
    result:''
  },
  getUserInfo:function(){
    wx.getUserProfile({
      desc: '获取用户信息',
      success:(res) => {
        console.log(res)
        this.setData({
          avatarUrl:res.userInfo.avatarUrl,
          nickName:res.userInfo.nickName
        })
      }
    })
  },
  wxlogin:function(){
    wx.login({
      success: (res) => {
        console.log("授权码:"+res.code)
        this.setData({
          code:res.code
        })
      }
    })
  },
  sendRequest:function(){
    wx.request({
      url: 'http://localhost:8080/user/shop/status',
      method:'GET',
      success:(res) => {
        console.log("响应结果:" + res.data.data)
        this.setData({
          result:res.data.data
        })
      }
    })
  }})
```
**2). 编译**
点击编译按钮
<img src="https://pic.bitday.top/i/2025/04/22/sg3fzg-0.png" alt="image-20221204181233015" style="zoom:50%;" />
**3). 运行效果**
<img src="https://pic.bitday.top/i/2025/04/22/sg3efk-0.png" alt="image-20221204181606927" style="zoom:50%;" />
点击**获取用户信息**
<img src="https://pic.bitday.top/i/2025/04/22/sg3g33-0.png" alt="image-20221204182056440" style="zoom: 67%;" />
点击**微信登录**
<img src="https://pic.bitday.top/i/2025/04/22/sg3d01-0.png" alt="image-20221204182238762" style="zoom: 67%;" />
点击**发送请求**
因为请求http://localhost:8080/user/shop/status先要启动后台项目。
<img src="https://pic.bitday.top/i/2025/04/22/sg3e6m-0.png" alt="image-20221204192519728" style="zoom: 67%;" />
**注:**设置不校验合法域名,若不勾选,请求发送失败。
#### 发布小程序
小程序的代码都已经开发完毕,要将小程序发布上线,让所有的用户都能使用到这个小程序。
点击上传按钮:
<img src="https://pic.bitday.top/i/2025/04/22/sg3edv-0.png" alt="image-20221204225355015" style="zoom:50%;" />
指定版本号:
<img src="https://pic.bitday.top/i/2025/04/22/sg3dl2-0.png" alt="image-20221204225502698" style="zoom:50%;" />
上传成功:
<img src="https://pic.bitday.top/i/2025/04/22/sg3d7x-0.png" alt="image-20221204225557820" style="zoom:50%;" />
把代码上传到微信服务器就表示小程序已经发布了吗?
**其实并不是。**当前小程序版本只是一个开发版本。
进到微信公众平台,打开版本管理页面。
<img src="https://pic.bitday.top/i/2025/04/22/sg3dk6-0.png" alt="image-20221204230231476" style="zoom:50%;" />
需提交审核,变成审核版本,审核通过后,进行发布,变成线上版本。
一旦成为线上版本,这就说明小程序就已经发布上线了,微信用户就可以在微信里面去搜索和使用这个小程序了。
## 微信登录
### 导入小程序代码
开发微信小程序,本质上是属于前端的开发,我们的重点其实还是后端代码开发。所以,小程序的代码已经提供好了,直接导入到微信开发者工具当中,直接来使用就可以了。
**1). 找到资料**
<img src="https://pic.bitday.top/i/2025/04/22/sg3hhg-0.png" alt="image-20221204205429798" style="zoom: 67%;" />
**2). 导入代码**
<img src="https://pic.bitday.top/i/2025/04/22/sg3bgu-0.png" alt="image-20221204205631809" style="zoom:50%;" />
AppID使用自己的AppID
<img src="https://pic.bitday.top/i/2025/04/22/sg3gdx-0.png" alt="image-20221204210011364" style="zoom:50%;" />
**3). 查看项目结构**
主体的文件:app.js app.json app.wxss
项目的页面比较多主要存放在pages目录。
<img src="https://pic.bitday.top/i/2025/04/22/sg3bvh-0.png" alt="image-20221204210739195" style="zoom:50%;" />
**4). 修改配置**
因为小程序要请求后端服务需要修改为自己后端服务的ip地址和端口号(默认不需要修改)
common-->vendor.js-->搜索(ctrl+f)-->baseUri
<img src="https://pic.bitday.top/i/2025/04/22/sg3ech-0.png" alt="image-20221204211239035" style="zoom:50%;" />
### 微信登录流程
微信登录https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
**流程图:**
<img src="https://pic.bitday.top/i/2025/04/22/sg3du1-0.png" alt="image-20221204211800753" style="zoom:50%;" />
**步骤分析:**
1. 小程序端调用wx.login()获取code就是授权码。
2. 小程序端调用wx.request()发送请求并携带code请求开发者服务器(自己编写的后端服务)。
3. 开发者服务端通过HttpClient向微信接口服务发送请求并携带appId+appsecret+code三个参数。
4. 开发者服务端接收微信接口服务返回的数据session_key+opendId等。opendId是微信用户的唯一标识。
5. 开发者服务端,自定义登录态,生成令牌(token)和openid等数据返回给小程序端方便后绪请求身份校验。
6. 小程序端收到自定义登录态存储storage。
7. 小程序端后绪通过wx.request()发起业务请求时携带token。
8. 开发者服务端收到请求后通过携带的token解析当前登录用户的id。
9. 开发者服务端,身份校验通过后,继续相关的业务逻辑处理,最终返回业务数据。
接下来我们使用Postman进行测试。
**说明:**
1. 调用 [wx.login()](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html) 获取 **临时登录凭证code** ,并回传到开发者服务器。
2. 调用 [auth.code2Session](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html) 接口,换取 **用户唯一标识 OpenID** 、 用户在微信开放平台帐号下的**唯一标识UnionID**(若当前小程序已绑定到微信开放平台帐号) 和 **会话密钥 session_key**
3. code是临时的同一个用户同一个小程序中使用不同的code可以获得唯一的openid
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
**实现步骤:**
**1). 获取授权码**
点击确定按钮,获取授权码,每个授权码只能使用一次,每次测试,需重新获取。
<img src="https://pic.bitday.top/i/2025/04/22/sg3nkv-0.png" alt="image-20221204222008130" style="zoom: 67%;" />
**2). 明确请求接口**
请求方式、请求路径、请求参数
<img src="https://pic.bitday.top/i/2025/04/22/sg3j9x-0.png" alt="image-20221204222434054" style="zoom:50%;" />
**3). 发送请求**
获取session_key和openid
<img src="https://pic.bitday.top/i/2025/04/22/sg3mlq-0.png" alt="image-20221204223956568" style="zoom:50%;" />
若出现code been used错误提示说明授权码已被使用过请重新获取
<img src="https://pic.bitday.top/i/2025/04/22/sg3pj1-0.png" alt="image-20221204224130409" style="zoom:50%;" />
### 需求分析和设计
#### 产品原型
用户进入到小程序的时候,微信授权登录之后才能点餐。需要获取当前微信用户的相关信息,比如昵称、头像等,这样才能够进入到小程序进行下单操作。是基于微信登录来实现小程序的登录功能,没有采用传统账户密码登录的方式。若第一次使用小程序来点餐,就是一个新用户,需要把这个新的用户保存到数据库当中完成自动注册。
**登录功能原型图:**
<img src="https://pic.bitday.top/i/2025/04/22/swrbf2-0.png" alt="image-20221205173711304" style="zoom:50%;" />
**业务规则:**
- 基于微信登录实现小程序的登录功能
- 如果是新用户需要自动完成注册
#### 接口设计
通过微信登录的流程如果要完成微信登录的话最终就要获得微信用户的openid。在小程序端获取授权码后向后端服务发送请求并携带授权码这样后端服务在收到授权码后就可以去请求微信接口服务。最终后端向小程序返回openid和token等数据。
基于上述的登录流程,就可以设计出该接口的**请求参数**和**返回数据**。
<img src="https://pic.bitday.top/i/2025/04/22/swrcfp-0.png" alt="image-20221205175429394" style="zoom:50%;" /> <img src="D:/folder/study/黑马程序员/苍穹外卖/讲义/讲义/day06/assets/image-20221205175441256.png" alt="image-20221205175441256" style="zoom:50%;" />
**说明:**请求路径/user/user/login,第一个user代表用户端第二个user代表用户模块。