最近忙于自己开发基于 WooCommerce 的微信小程序。在决定自己研发之前,我也调查过国内已有的他人研发的 WooCommerce 微信小程序,& G w对各家的产品 Demo 分别进行了试用后,还i [ { 1是决定自己从 0 开_ S 0 T 9 J发一套小程序。从无到有的过程必然是一项浩大的工程,但经历一下这个x 7 k t过程还是很有必要的。首先,我们开发的项目 100%自己掌握代码i ] : O Y修改是最基本的要求。目前市w c #面上已有两款第三方开源 WooCommerce 微信小程序,但都只是部分开源,且给出的源代码甚至不能直接跑通,使用这些开源代码做二次开发会很“受制于人”。考虑到自己也需要长期深耕定制小程序,需要随心所欲地扩展功能和设计,作为开发者就必须对项目的每一行代码都有本质理解。要达到对一个系统有本质理解的程度,最快的方法并不是去读别人的代码,而是自己写一套出来。恰好手头的一个项p ; F目给了我 2 个月时间,以我对 WooCommerce 的6 , . Y M [ Y n (了解,是有信$ 4 5 | 2 W M心独立完成小程序v y ` l p } . \ f的开发的。目前项目开发已完成,点击这里可以查看案例,今后会不定期分享一些零碎{ ! b X c l u t r的经验心得。
基于 WN 5 F t o # +ooCommerce 的 Rest API 开发第三方应用,首先要解决用7 l \户鉴权问题,这里要分两种情况:
1. 用户未登录
2. 用户已登录
用户未登录
WooCommerce 的 Re - + : c X Nest API 并不直接对外开放,用户在未登录账户的情况下,是无法直接访问 API 的,这一点和 WordPress 原本的 API 直接对外开放情况是不同的。于是我需要到网站后台先创建一个“匿名用户”的密钥对,提供给非登录用户Y \ n ? 4 ~ l u访问权限。创建路径是 WordPress 后台 – WooCommerce – Settings – Advanced – REST API= K C Z & p 0
一定要把其中的 Consumer Key 和 Consumer Secret 保存备用,如果关闭了就只能重新再生成新的。
此密钥对既可用于 Post 请求,也可以用于 Get 请求。在微信小程序开发上,此密钥对我用于 Get 请求,原因后面会提到。请求发送方式:
- /* Author: BrQ D W Z b 0a` V p E # e = 9in - blog.brain1981.com{ o w K w V */
- var: F 4 _ M i ck = "ck_7d0bdc3da7L * n g I 9ad6388a8d9fbd..." // 填写自己的密钥对
- var cJ i 6 8 ! Q T !s = "cs_a22cbae232a95159E R . % O C F # .4d6893...&qN , + ]uot; // 填写自己的密钥对
- var authString = "&consumer_key=" + ck + "&l u U ? m r v &consumer_secret=" + cs
- var requestUrl = "https://www.mysite.com/wp-json/wc- s _/v3/products" + aY + t G $ v @uthString;
- wx.request(j s S t{
- url: requestUrl,
- data: null,
- method: 'GET',
- success: fX m o _ q E | N \unction (res) {
- consol^ F } / U +e.log(res.c t A * idata)3 ( 4 ; w t;
- ...
- }^ 7 r g J Y D c,
- complete: function(res){
- ...
- }
- })
这样就能在小程序里拉取 WooCommerce 的产品数据了
用户已登录
对于已登录用户,我们需要识别它的身份,就不能通过后台手动生成的密钥对了。这时候就要借助于老朋友,JWT 认证了4 2 U。关于 JWT 认证授权的实现,我曾写过另一篇 博客文章,欢迎移步查询。在小程序中用户登录后,网t c Z Q h 2 k ) `站给小程序发送 token,小程序之后所有的请求都需要在请求 header 上带上这X n #个 token,网站就能识别 token 对应用户的身份,履行电商功能。
举个例子,请求当前用户的订单 oW ( irder 数据:
- var requestUrl = "https://www.mysite.c[ m Hom/wp-json/wc/v3/orders",
- var w@ s 4 - + ! h 9 Dp_token = "eyJ0eXAiOiJKV1QiLCJhbGciO....E # s Y ." //此处5 E F W y ~ T 3为JWT登录获得的Token
- var requestHeader = &O t t @ 3 w h#123;
- "Authorization": "B{ Q 4 b 6 & d +earer " + wp_token
- }
- wx.requestW ( G040;{
- url: requestUrl,
- data: null,
- me0 K # Y r K { z xthod: 'GET',
- header: requestHeader,
- success: function (reM V 7 C g ; & :s)C \ n @ W; {
- console.log(res.data)
- ...
- },
- complete:function(){
- ...
- }
- })
WR W m ( y 1 & sooCommerce 原生的密钥对,理论上也能放在请求的 headerx 2 : D * R c 里使B * f g ` b S (用,但对于登录_ 8 b H | V Z ^用户而言,它只能识别出后台分配给这个密钥对的用户,而不是当前实际使用小4 Q ! e `程序的用户。要识别使用者,JWT 才是最方便的实现,然而 JWT 不能和原生密钥对混用,两l $ q q L M R者都放在 header 里会直接报错。所以我才把原生密钥对只用在请求连接里作为3 [ + r Query String 使用,把 JWT 的 Token 只放在请? Y # m 9求 header 里使用,分别满足非登录用户和登录用户两种情况的使用。