前言
????之前講過如何利用公眾號針對指定用戶完成業(yè)務操作之后實時發(fā)送消息.就好比在線醫(yī)院公眾號中看病掛號,掛號預約成功之后微信列表中會新增一條關注的公眾號預約成功消息.具體實現(xiàn)步驟可以看下文章如何實現(xiàn):手把手教你微信公眾號如何給指定用戶發(fā)送消息提醒,有興趣的可以看下。現(xiàn)在要從小程序中要加入引導關注公眾號并授權的功能,用于使用公眾號發(fā)送業(yè)務消息提醒,注意這里不是訂閱消息。
????參考過很多其他同學的實現(xiàn)方案,總感覺有些繁瑣,并且接口有調用次數(shù)的限制。結合業(yè)務場景梳理了一下流程,并對具體的實現(xiàn)做了詳細說明,希望對有同樣需求的同學有所幫助,下面詳細說下整個流程。
業(yè)務流程說明
????用戶登錄小程序進入到消息模塊之后,對于沒有關注公眾號的用戶或是已經關注公眾號但是沒有授權的用戶顯示引導關注公眾號提示信息,已經關注公眾號并授權處理的不顯示(授權邏輯主要是指將用戶關注公眾號的openID與用戶信息進行綁定,下文會詳細講)業(yè)務截圖如下:
????點擊進入關注公眾號頁面,這里進入的是公眾號發(fā)布的一篇公眾號關注文章,業(yè)務截圖如下:
????沒有關注公眾號的進入到關注頁面。
????對于已關注公眾號的用戶,直接進入公眾號聊天頁面,設置默認回復為授權鏈接(進入到此頁面的為已關注公眾號但是沒有授權的用戶)。截圖如下:
????點擊開通消息之后進入到授權頁面進行授權即可,授權成功之后跳轉到小程序完成授權操作。
????以上是對小程序中引導關注公眾號的流程梳理,下面說下如何進行實現(xiàn),主要側重于服務端講解實現(xiàn)原理!
實現(xiàn)方案說明
????這里需要用戶進入到小程序之后獲取一下用戶的unionId,unionId可以說是同一個用戶在微信開放平臺下各個產品中的唯一標識.openId在微信平臺下每個產品是唯一的.兩個都需要后端進行入表操作.unionId可以放到用戶注冊登錄中實現(xiàn).openId入表邏輯可以放到授權操作中(這里使用的是公眾號的openID,因為官方提供的公眾號發(fā)送消息接口中需要獲取關注公眾號用戶的唯一標識openID).主要說下本文重點:如何判斷用戶是否關注過公眾號.梳理邏輯如下:
????判斷的主要邏輯是看用戶表信息中是否有維護過公眾號的openId,如果有則說明之前關注過,但考慮到關注的用戶可能會取消關注但是表中還保存著之前的公眾號openId,所以這里調用官方的獲取用戶基本信息接口根據subscribe
進行判斷現(xiàn)在用戶是否處于關注狀態(tài).subscribe表示用戶是否訂閱該公眾號標識,值為0時,代表此用戶沒有關注該公眾號,拉取不到其余信息。官方接口截圖如下:
????這里再貼一下公眾號網頁授權流程:
需要在授權操作中維護一下用戶在公眾號下面的唯一標識:openId.
代碼以及表結構實現(xiàn)
用戶表結構設計如下:
CREATE TABLE `user` (
`user_id` bigint(20) NOT NULL AUTO_INCREMENT,
`login` varchar(20) NOT NULL COMMENT '用戶唯一標識',
`union_id` varchar(30) NOT NULL COMMENT '用戶unionId',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
`update_time` datetime DEFAULT NULL COMMENT '更新時間',
`gzh_open_id` varchar(60) DEFAULT '' COMMENT '用戶關注的公眾號openId',
PRIMARY KEY (`user_id`),
UNIQUE KEY `unique` (`login`),
UNIQUE KEY `unionId_unique` (`union_id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COMMENT='用戶信息表';
????主要提供兩個接口,一個是判斷用戶數(shù)是否關注公眾號并授權,另一個是用戶授權接口(主要邏輯是引導用戶關注公眾號后將公眾號openid綁定用戶信息入表)。現(xiàn)提供兩個接口的實現(xiàn)邏輯。
1.判斷用戶是否關注公眾號并授權
@ApiOperation(value = "判斷用戶是否關注公眾號并授權:true表示關注且授權,false表示未關注或已關注未授權",notes = "返回true表示已關注公眾號并已進行授權(用戶信息中維護openId),頁面不做引導處理.返回false表示沒有關注公眾號或是關注公眾號之后沒有授權,可引導關注并授權")
@ApiImplicitParams({
@ApiImplicitParam(name = "unionId", value = "unionId", required = true, dataType = "Boolean", paramType = "query",example = "1")})
@GetMapping("/checkIsFollowGzg")
public ResultVo checkIsFollowGzg(@NotBlank(message = "unionId不允許為空!") String unionId){
boolean returnFlag = userService.checkIsFollowGzg(unionId);
return ResultVoUtil.success(returnFlag);
}
service層實現(xiàn)具體邏輯:
@Override
public boolean checkIsFollowGzg(String unionId) {
boolean returnFlag=false;
// 根據unionId查詢用戶關注公眾號的openId
User userBasicInfo = userMapper.findUserBasicInfo(unionId,null);
if(ObjectUtil.isNull(userBasicInfo)) throw new BussinessExcption(ApiCode.SYSTEM_EXCEPTION.getMessage());
String gzhOpenId = userBasicInfo.getGzhOpenId();
if(StrUtil.isBlank(gzhOpenId)) return returnFlag;
// 根據公眾號的openId和accessToken判斷用戶是否關注(subscribe為1表示關注)
// 獲取微信認證信息
String wxgAccessToken = getWxgAccessToken();
if (checkIsGzhUer(gzhOpenId, wxgAccessToken)) return true;
return false;
}
/**
* @Author: txm
* @Description: 獲取公眾號認證AccessToken
* @Param: []
* @return: java.lang.String
* @Date: 2022/10/5 10:47
**/
public String getWxgAccessToken() {
String returnMsg="";
JSONObject accessTokenObject = null;
String gzhAppId =jobConfig.getGzhAppId();
String gzhSecret=jobConfig.getGzhSecrect();
String requestUrl = StrUtil.format(Constants.GZH_ACCESS_TOKEN_URL, gzhAppId, gzhSecret);
try {
returnMsg=HttpUtil.get(requestUrl);
accessTokenObject = JSON.parseObject(returnMsg);
log.info("錯誤信息:{}",accessTokenObject);
} catch (Exception e) {
log.error("獲取用戶AccessToken認證信息失敗:{}",e.getMessage());
}
String accessToken = accessTokenObject.getString("access_token");
if(StrUtil.isBlank(accessToken)) throw new BussinessExcption("響應異常:獲取accessToken信息為空!");
return accessToken;
}
/**
* @Author: txm
* @Description: 校驗是否是關注過公眾號用戶,返回false表示沒有關注公眾號;返回true表示關注過公眾號
* @Param: [gzhOpenId, wxgAccessToken]
* @return: boolean
* @Date: 2022/10/8 16:06
**/
private boolean checkIsGzhUer(String gzhOpenId, String wxgAccessToken) {
// 根據獲取公眾號用戶基本信息
String responBasicUserInfo="";
JSONObject basicUserInfo = null;
String reqUrl = StrUtil.format(Constants.USER_BASIC_INFO_URL, wxgAccessToken, gzhOpenId);
try {
responBasicUserInfo= HttpUtil.get(reqUrl);
basicUserInfo = JSON.parseObject(responBasicUserInfo);
} catch (Exception e) {
log.error("獲取用戶公眾號基本信息失敗:{}",e.getMessage());
}
if(ObjectUtil.isNull(basicUserInfo)) throw new BussinessExcption(ApiCode.SYSTEM_EXCEPTION.getMessage());
// 用戶是否訂閱該公眾號標識,1表示關注,值為0時,代表此用戶沒有關注該公眾號,拉取不到其余信息。
if(StrUtil.isBlank(basicUserInfo.getString("subscribe")) || StrUtil.equals("0",basicUserInfo.getString("subscribe"),true)) return false;
return true;
}
2.用戶授權操作
@ApiOperation("公眾號授權操作:判斷是否關注公眾號:返回true表示已經關注公眾號用戶并綁定公眾號openId,返回false表示沒有關注公眾號")
@PostMapping("/getWxgUserInfo")
public ResultVo getWxgUserInfo(@RequestBody @Validated WxgUserInfoDto wxgUserInfoDto){
userService.getWxgUserInfo(wxgUserInfoDto);
return ResultVoUtil.success();
}
service層實現(xiàn)邏輯:
/**
* @Author: txm
* @Description: 授權處理
* @Param: [wxgUserInfoDto]
* @return: void
* @Date: 2022/10/5 9:08
**/
@Override
public void getWxgUserInfo(WxgUserInfoDto wxgUserInfoDto) {
// 網頁授權根據code獲取access_token
JSONObject accessTokenInfo = getWxgAccessTokenInfo(wxgUserInfoDto.getCode());
String accessToken = accessTokenInfo.getString("access_token");
String openid = accessTokenInfo.getString("openid");
if(StrUtil.isBlank(accessToken)|| StrUtil.isBlank(openid)) throw new BussinessExcption("獲取用戶信息失敗:accessToken或openId獲取為空!");
// 根據公眾號的openId和accessToken判斷用戶是否關注(subscribe為1表示關注)
// 獲取微信認證信息access_token
String wxgAccessToken = getWxgAccessToken();
// 校驗用戶是否已經關注公眾號,已經關注公眾號需要查詢是否維護過公眾號的openId
if (checkIsGzhUer(openid, wxgAccessToken)){
// 根據unionId查詢用戶是否已經維護過公眾號openId,沒有的話需要更新用戶關注公眾號的openId
String login = wxgUserInfoDto.getLogin();
User userBasicInfo = userMapper.findUserBasicInfo(null,login);
if(ObjectUtil.isNull(userBasicInfo)) throw new BussinessExcption(ApiCode.SYSTEM_EXCEPTION.getMessage());
// 更新用戶公眾號openId
int i = userMapper.updateUserOpenId(openid, login);
if(i == 0) throw new BussinessExcption("操作失敗:更新信息為空!");
}
}
/**
* @Author: txm
* @Description: 獲取AccessToken
* @Param: [code]
* @return: com.alibaba.fastjson.JSONObject
* @Date: 2022/10/5 9:08
**/
public JSONObject getWxgAccessTokenInfo(String code) {
String accessTokenInfo = "";
JSONObject accessTokenObject = null;
String gzhAppId =jobConfig.getGzhAppId();
String gzhSecret=jobConfig.getGzhSecrect();
String reqUrl = StrUtil.format(Constants.ACCESS_TOKEN_URL, gzhAppId, gzhSecret, code);
try {
accessTokenInfo=HttpUtil.get(reqUrl);
log.info("錯誤信息:{}",accessTokenInfo);
accessTokenObject = JSON.parseObject(accessTokenInfo);
} catch (Exception e) {
log.error("獲取用戶AccessToken認證信息失敗:{}",e.getMessage());
}
return accessTokenObject;
}
用戶信息操作接口:
public interface UserMapper {
// 根據unionId查詢用戶基本信息
User findUserBasicInfo(String unionId);
}
用戶信息持久層配置文件:
<!-- 獲取用戶基本信息,實體類暫不提供可自行自定義-->
<select id="findUserBasicInfo" resultType="com.kawa.job.api.wanted.user.entity.User">
select user_id,login,gzh_open_id from job_user where union_id=#{unionId} limit 1
</select>
????以上是處理小程序中引導關注公眾號的處理方案,如果看完感覺有所幫助,歡迎評論區(qū)留言或點贊,每個贊美都是對自己最大的鼓勵和支持!文章來源:http://www.zghlxwxcb.cn/news/detail-484811.html
官方文檔鏈接:公眾號官方文檔文章來源地址http://www.zghlxwxcb.cn/news/detail-484811.html
到了這里,關于微信小程序中引導用戶關注公眾號實現(xiàn)方案詳細說明的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!