微信小程序服务端api签名,安全鉴权模式介绍,通过封装方法实现请求内容加密与签名

概述

在开发微信小程序的时候,不免要对接小程序的API接口,大多数不涉及敏感信息的都可以使用明文传输返回,但是有些接口就必须遵循安全鉴权模式,虽然这样比较安全,但是对于开发来讲确实是有难度的,我们需要对原API的请求内容加密与签名,同时API的回包内容需要开发者验签与解密。

这篇文章就给大家介绍如何开启API安全,已经如何使用我封装的方法,通过微信物流服务接口的示例,让大家能快捷的实用API加密接口。

签名与验签

平台支持对接口的请求内容和响应内容进行 AES256/SM4 加密(资源上传类API暂不支持加密),加密后,在网络上传输的接口报文内容将会由明文内容变为密文内容,可以大幅提升接口内容传输的安全性。 接口数据加密与签名,可以在接口数据泄露的情况下,确保接口内容保密且不被篡改。 开发者应先加密请求数据,然后对密文签名。

上面的介绍和图示写了好像也不明白是什么意思对吧,下面就跟着我的步骤来给大家一步步的剖析吧。

一、开启API安全

1.在小程序后台,管理->开发管理->API安全,点击修改

2.配置API对称秘钥,使用随机生成即可,生成之后,自己在你常用的文档中做好备份记录

3.API非对称秘钥

也可以随机生成秘钥对,但是不要复制上面生成的新秘钥,这个是PUBLIC公共秘钥,我们要点击下面的"下载私钥" 下载下来,检查一下前缀是"RSA PRIVATE KEY",这里面的代码才是我们需要的私钥 点击"确认",会返回到刚刚的开发管理页面,可以看到不同秘钥类型有对应的编号,这个也要对应的存下来,API签名也会用到的。 保存好设置的API安全的编号及秘钥后,这样准备工作就做好了,来看一下如何使用我的插件调用API加密接口的。

二、使用xxm-wx-crypto加密与签名插件

1.下载xxm-wx-crypto插件

插件地址:ext.dcloud.net.cn/plugin?id=2...

2.插件参数配置

下载插件到项目,在unicloud -> cloudfunctions -> common 目录下会新增xxm-wx-crypto公共模块,修改目录下的config.js,设置你自己小程序后台对称密钥和非对称秘钥。

在上面API安全中,我们已经保存了秘钥,配置如下: 注意: 该插件是基于uni-id的,所以在插件的config.js中直接读取的公共模块"uni-config-center"内的mp-weixin的appid和secret,如果你不是基于uni-id的unicloud云开发项目,那么你只需要将appid和secret放到config.js中即可,如下代码所示:

javascript 复制代码
//基于uni-id可直接读取appid和secret
const configCenter = require("uni-config-center/uni-id/config.json")
const {
	appid,
	appsecret: secret
} = configCenter['mp-weixin']['oauth']['weixin'];

//非uni-id可直接设置
const appid="wx30f1d3a4187cf93253a";
const secret="87a0ee0dc159db5f21b2f6b307a273f3abe";

3.数据初始化

该项目依赖于插件"xxm-wx-mp-token"用于存储微信小程序token的方法,所以需要按照下面的步骤进行初始化,如果项目中之前已经安装过插件"xxm-wx-mp-token",那么就可以直接忽略这一步;

在uniCloud -> database内有wx-access-token.schema.json(单击右键上传schema)、wx-access-token.init_data.json(初始化云数据数据);

三、在项目中应用

插件已经安装完成了,我们就使用微信小程序"同城配送"API加密接口为例,来演示一下这个插件的应用。

1.引入xxm-wx-crypto公共模块

在需要的云函数/云对象文件夹上,单击右键"管理公共模块或扩展库依赖",选择项目下的公共模块,勾选"xxm-wx-crypto"公共模块;

2.导入公共模块

在你的cloudfunctions云函数/云对象内部,导入公共模块"xxm-wx-crypto"内的encryption方法

javascript 复制代码
const { encryption } = require("xxm-wx-crypto");

3.查询门店接口

以微信同城配送加密API接口为例,调用同城中查询门店接口

javascript 复制代码
async demoFn() {
    return await encryption({
        url_path: "https://api.weixin.qq.com/cgi-bin/express/intracity/querystore"
    });
}

输出结果:

javascript 复制代码
{
    "errcode": 0,
    "errmsg": "ok",
    "appid": "wx3f17cf93d3a4823a",
    "store_list": [{
        "wx_store_id": "4000000000017626017",
        "out_store_id": "",
        "city_id": 370100,
        "address_info": {
            "province": "山东省",
            "city": "济南市",
            "area": "历下区",
            "street": "舜华路街道",
            "house": "工业南路57号",
            "lat": 36.685902,
            "lng": 117.128315,
            "phone": "***"
        },
        "order_pattern": 1,
        "service_trans_prefer": ""
    }],
    "_n": "83c77a542ce4be19d4b319ec2edcc453",
    "_appid": "wx3f17cf93d3a4823a",
    "_timestamp": 1755578704
}

总结

看着文档非常复杂,其实按照步骤,配合插件很容易就可以实现调用微信加密API接口了,大家可以下载插件源码研究一下如何实现加密与解密的,如果发现插件有优化的地方,也可以给我评论留言哈,感谢各位的观看。

相关推荐
韩沛晓19 分钟前
uniapp跨域怎么解决
前端·javascript·uni-app
武昌库里写JAVA1 小时前
使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程
java·vue.js·spring boot·sql·学习
HANK2 小时前
ECharts高效实现复杂图表指南
前端·vue.js
Juchecar2 小时前
Vue3 响应式 ref 和 reactive 原理详解及选择建议
前端·vue.js
zuo-yiran2 小时前
element table 表格多选框选中高亮
vue.js·elementui
Aotman_2 小时前
el-input 重写带图标密码框(点击小眼睛显示、隐藏密码)
前端·javascript·vue.js
lineo_2 小时前
手写 pinia 持久化缓存插件,兼容indexDB
前端·vue.js
王林不想说话2 小时前
新的枚举使用方式enum-plus
前端·vue.js·typescript
前端W3 小时前
图片裁剪使用说明文档
vue.js
java水泥工3 小时前
Java项目:基于SpringBoot和VUE的在线拍卖系统(源码+数据库+文档)
java·vue.js·spring boot