无需交 300 元认证费,快速创建已认证的小程序

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 快速创建小程序接口优化了小程序注册认证的流程,能帮助第三方平台迅速拓展线下商户,拓展商户的服务范围,占领小程序线下商业先机。采用法人人脸识别方式替代小额打款等认证流程,极大的减轻了小程序主体、类目资质信息收集的人力成本。通过该接口创建小程序默认为“已认证”。为降低接入小程序的成本门槛,通过该接口创建的小程序无需交 300 元认证费。

快速创建小程序接口优化了小程序注册认证的流程,能帮助第三方平台迅速拓展线下商户,拓展商户的服务范围,占领小程序线下商业先机。采用法人人脸识别方式替代小额打款等认证流程,极大的减轻了小程序主体、类目资质信息收集的人力成本。通过该接口创建小程序默认为“已认证”。为降低接入小程序的成本门槛,通过该接口创建的小程序无需交 300 元认证费。

image.png

1、验证票据

验证票据(component_verify_ticket),在第三方平台创建审核通过后,微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送 component_verify_ticket

接收 POST 请求后,只需直接返回字符串 success。

image.png

@RequestMapping(value = "saveTicket")
@ResponseBody
public void saveTicket(HttpServletRequest request, HttpServletResponse response) throws IOException {
  String msgSignature = request.getParameter("msg_signature");// 微信加密签名
  String timeStamp = request.getParameter("timestamp");// 时间戳    
  String nonce = request.getParameter("nonce"); // 随机数  
  BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
  StringBuffer sb = new StringBuffer();
  String line = null;
  while ((line = br.readLine()) != null) {
    sb = sb.append(line);
  }
  String postData = sb.toString();
  try {
    AuthorizedUtils.saveComponentVerifyTicket(msgSignature, timeStamp, nonce, postData);
  } catch (Exception e) {
    logger.error("系统异常", e);
  } finally {
    // 响应消息
    PrintWriter out = response.getWriter();
    out.print("success");
  }
}

2、获取令牌

令牌(component_access_token)是第三方平台接口的调用凭据。令牌的获取是有限制的,每个令牌的有效期为 2 小时,请自行做好令牌的管理,在令牌快过期时(比如1小时50分),重新调用接口获取。

RedisService<ComponentToken> redisService = RedisService.load();
ComponentToken componentToken = redisService.load(ComponentToken.COMPONENTTOKEN_ID, ComponentToken.class);  
logger.warn("2、获取第三方平台component_access_token---->开始 ");
if (componentToken == null) {
  logger.warn("2、获取第三方平台component_access_token---->从微信获得");
  String encryptAppId = ParameterUtil.SE_APPID;
  String appId = EnDecryptUtil.d3esDecode(encryptAppId);
  String encryptSecret = ParameterUtil.SE_SECRET;
  String secret = EnDecryptUtil.d3esDecode(encryptSecret);  
  String requestUrl = component_access_url;
  Map<String, String> map = new HashMap<>(); 
  map.put("component_appid", appId); //第三方平台appid
  map.put("component_appsecret", secret); //第三方平台appsecret
  map.put("component_verify_ticket", ticket); 
  String outputStr = JSONObject.toJSONString(map);
  logger.warn("请求数据"+outputStr);
  JSONObject jsonObject = HttpRequestUtils.httpRequest(requestUrl, "POST", outputStr);
  logger.warn("2、获取第三方平台component_access_token---->从微信获得数据" + jsonObject);
  if (null != jsonObject) {
    long expires = System.currentTimeMillis() + 7200;
    try{
      expires = System.currentTimeMillis() + jsonObject.getIntValue("expires_in");        
    }catch (Exception e) {
    }
    try {
      componentToken = new ComponentToken();
      componentToken.setComponentAccessToken(jsonObject.getString("component_access_token"));
      componentToken.setExpiresIn(expires);
      redisService.save(componentToken, ComponentToken.class);
    } catch (Exception e) {
      componentToken = null;
      logger.error("系统异常", e);
    }
  }
} else {
  long sysTime = System.currentTimeMillis();
  if (sysTime >= componentToken.getExpiresIn()) {
    logger.warn("2、获取第三方平台component_access_token---->从缓存获得的componentToken时间超时");
    redisService.delete(ComponentToken.COMPONENTTOKEN_ID, ComponentToken.class);
    componentToken = getComponentToken(ticket);
  }else{
    logger.warn("2、获取第三方平台component_access_token---->成功从缓存获得的componentToken");
  }
}
    return componentToken;
}

3、创建小程序

第三方平台只需收集法人姓名、法人微信、企业名称、企业代码信息这四个信息,便可以向企业法人下发一条模板消息来采集法人人脸信息,完成全部注册、认证流程。

public static JSONObject fastreGisterWeApp(String componentAccessToken) {
Map<String,Object> map = new HashMap<>();
map.put("name","企业名(需与工商部门登记信息一致)");
map.put("code","企业代码");
map.put("code_type","企业代码类型 1:统一社会信用代码(18 位) 2:组织机构代码(9 位 xxxxxxxx-x) 3:营业执照注册号(15 位)");
map.put("legal_persona_wechat","法人微信号");
map.put("legal_persona_name","法人姓名(绑定银行卡)");
map.put("component_phone","第三方联系电话(方便法人与第三方联系)");
String requestParam = JSON.toJSONString(map);
JSONObject jsonObject = CommonUtil.httpsRequestJson("https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp?action=create&component_access_token="+componentAccessToken, "POST", requestParam);
return jsonObject;
}

image.png

image.png

image.png

4、获取预授权码

预授权码(pre_auth_code)是第三方平台方实现授权托管的必备信息,每个预授权码有效期为 10 分钟。需要先获取令牌才能调用

public static String getPreAuthCode(String ticket) {
logger.warn("4、获取预授权码pre_auth_code---->开始");
ComponentToken componentToken = getComponentToken(ticket);
String encryptAppId = ParameterUtil.SE_APPID;
String appId = EnDecryptUtil.d3esDecode(encryptAppId);
String url = pre_auth_code_url + componentToken.getComponentAccessToken();
Map<String, String> map = new HashMap<String, String>();
map.put("component_appid", appId);
JSONObject jsonObject = HttpRequestUtils.httpRequest(url, "POST", JSONObject.toJSONString(map));
logger.warn("4、获取预授权码pre_auth_code---->成功获得" + jsonObject.getString("pre_auth_code"));
return jsonObject.getString("pre_auth_code");
}

5、引导用户进入授权页

第三方服务商构建授权链接放置自己的网站,用户点击后,弹出授权页面。

@ResponseBody
public JsonModel getAuthUrl() {
RedisService<ComponentVerifyTicket> redisService = RedisService.load();
ComponentVerifyTicket componentVerifyTicket = redisService.load(ComponentVerifyTicket.COMPONENT_VERIFY_TICKET_ID,
    ComponentVerifyTicket.class);
if(componentVerifyTicket == null){
  logger.warn("5.1、引入用户进入授权页---->失败,component_verify_ticket为nul");
  return JsonModel.toFail(null);
}else{
  String preAuthCode = AuthorizedUtils.getPreAuthCode(componentVerifyTicket.getComponentVerifyTicket());
  String encryptAppId = ParameterUtil.SE_APPID;
  String appId = EnDecryptUtil.d3esDecode(encryptAppId);
  String auth_type = ParameterUtil.SE_AUTH_TYPE;
  String requestUrl = auth_url;
  requestUrl = requestUrl.replace("COMPONENT_APPID", appId).replace("PRE_AUTH_CODE", preAuthCode)
      .replace("REDIRECT_URI", ParameterUtil.SE_RE_URI).replace("AUTH_TYPE", auth_type);
  logger.warn("5.1、引入用户进入授权页---->成功,url为:" + requestUrl);
  return JsonModel.toSuccess(requestUrl);
}
}

@RequestMapping(value = "/authCallback")
@ResponseBody
public String authCallback(HttpServletRequest request, HttpServletResponse response) {
String code = request.getParameter("auth_code");
logger.error("5.2、引入用户进入授权页(方式一:授权注册页面扫码授权) 回调接口,传入的code={}, businessId={}", code, businessId);
if(code == null || "".equals(code)){
  logger.error("5.2、引入用户进入授权页(方式一:授权注册页面扫码授权) 回调接口,出错,微信请求的code为null,");
  return "success";
}
AuthorizationInfo authorizationInfo = this.initAuthorizationInfo(code);
AuthorizedUtils.getAuthorizerInfo(authorizationInfo);
return "success";
}

public static AuthorizationInfo initAuthorizationInfo(String code) {
logger.warn("5.3、使用授权码换取公众号或小程序的接口调用凭据和授权信息---->开始,code=" + code);
RedisService<ComponentVerifyTicket> redisService = RedisService.load();
ComponentVerifyTicket componentVerifyTicket = redisService.load(ComponentVerifyTicket.COMPONENT_VERIFY_TICKET_ID,
    ComponentVerifyTicket.class);
ComponentToken componentToken = getComponentToken(componentVerifyTicket.getComponentVerifyTicket());
String encryptAppId = ParameterUtil.SE_APPID;
String se_appId = EnDecryptUtil.d3esDecode(encryptAppId);    
String requestUrl = api_query_auth.replace("COMPONENT_ACCESS_TOKEN", componentToken.getComponentAccessToken());
Map<String, String> map = new HashMap<String, String>();
map.put("component_appid", se_appId);
map.put("authorization_code", code);
String outputStr = JSONObject.toJSONString(map);
JSONObject jsonObject = HttpRequestUtils.httpRequest(requestUrl, "POST", outputStr);
logger.warn("5.3、使用授权码换取公众号或小程序的接口调用凭据和授权信息---->返回对象内容:"+jsonObject);
AuthorizationInfo authorizationInfo = null;
if (jsonObject != null && jsonObject.getJSONObject("authorization_info") != null) {
  long sys_time = System.currentTimeMillis();
  authorizationInfo = jsonObject.getJSONObject("authorization_info").toJavaObject(AuthorizationInfo.class);
  long expires = sys_time + 6600000;
  authorizationInfo.setExpires_in(expires);  
  RedisService<AuthorizationInfo> redisService2 = RedisService.load();
  redisService2.save(authorizationInfo, AuthorizationInfo.class);
}
logger.warn("5.3、使用授权码换取公众号或小程序的接口调用凭据和授权信息---->结束");
return authorizationInfo;
}

image.png

免认证费的小程序创建成功

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

上一篇:Vue整合element-china-area-data实现PC端省市区三级联动选择器

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
监控 小程序 安全
社区每周丨支付有礼支持引导用户收藏小程序及人脸认证接口更新(8.7-8.11)
社区每周丨支付有礼支持引导用户收藏小程序及人脸认证接口更新(8.7-8.11)
176 11
|
6月前
|
运维 小程序 API
社区每周丨支付宝小程序导航栏升级及人脸认证计费规则更新
社区每周丨支付宝小程序导航栏升级及人脸认证计费规则更新
189 0
|
小程序 安全 定位技术
微信小程序学习实录4(开发前准备、认证必备资料、公众号关联小程序、小程序发布、开发配置、服务器域名、业务域名、位置接口设置)
微信小程序学习实录4(开发前准备、认证必备资料、公众号关联小程序、小程序发布、开发配置、服务器域名、业务域名、位置接口设置)
334 0
|
移动开发 小程序 前端开发
快速创建微信小程序,注册即认证,无需300元认证费
快速注册微信小程序,以前就搞过相关的系统开发,通过接口直接注册,真的是很方便,可以用【快准好】来形容。而且是注册即认证的效果,也就是说,只要注册成功,该小程序就是已认证的状态,无需再另外的认证费用。
135 0
快速创建微信小程序,注册即认证,无需300元认证费
|
小程序 前端开发
快速注册认证小程序,公众号开发版,授权登录流程代码说明
对于公众号开发,这已经是很老的话题了,之前倒是也做过些许,不过写的都是后端的接口,对于前端操作的一些流程还不是很清楚,比如很重要的一个入口功能,授权的流程。
242 0
快速注册认证小程序,公众号开发版,授权登录流程代码说明
|
JSON Kubernetes 算法
从认证到调度,K8s 集群上运行的小程序到底经历了什么?
不知道大家有没有意识到一个现实:大部分时候,我们已经不像以前一样,通过命令行,或者可视窗口来使用一个系统了。
从认证到调度,K8s 集群上运行的小程序到底经历了什么?
|
开发者
【小程序 Demo】带你玩转支付宝小程序之小程序刷脸认证示例
刷脸认证是一种目前越来越普及的身份验证方式,通过采集用户的面部特征,并与权威数据源比对,判断当前登录用户是否为账号的本人和真人。
4565 0
|
1月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
213 3
|
1月前
|
小程序 API
微信小程序更新提醒uniapp
在小程序开发中,版本更新至关重要。本方案利用 `uni-app` 的 `uni.getUpdateManager()` API 在启动时检测版本更新,提示用户并提供立即更新选项,自动下载更新内容,并在更新完成后重启小程序以应用新版本。适用于微信小程序,确保用户始终使用最新版本。以下是实现步骤: ### 实现步骤 1. **创建更新方法**:在 `App.vue` 中创建 `updateApp` 方法用于检查小程序是否有新版本。 2. **测试**:添加编译模式并选择成功状态进行模拟测试。
48 0
微信小程序更新提醒uniapp
|
3月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
104 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目