- 城市服务实名信息校验接口说明【监管原因,暂停开放】
备注说明:接口因为监管原因,2021年11月10日起停止开放。 一、接口说明 城市服务实名校验接口(以下称“本接口”),主要实现的功能是,在用户同意情况下,通过微信城市服务去校验用户(或业务方)输入的实名信息,是否正确且与用户在“开通微信支付”时,预留的实名信息一致。也即,校验输入的信息,是否正确且与微信支付绑卡用户的实名信息一致。 二、使用注意事项(接入必读) 1、本接口暂只支持校验基于大陆身份证 “姓名与身份证开通微信支付”的用户实名信息; 2、由于信息较为敏感,使用此接口校验用户(或业务方)输入的实名信息时,需要在页面前端征得用户的同意。因此调用此接口后,会跳转至微信官方的“用户同意”界面。用户点击同意按钮后方可继续后续调用。 3、请根据开放范围、场景所需及信息校验必要性申请本接口,并请谨慎使用。若后期使用过程中,用户举报较多或被发现在不合理使用,微信有权永久回收该小程序的该接口的权限。 三、接口开放范围及申请方式 3.1、接口开放范围 1、本接口目前为内测邀请开放阶段,免费开放给非个人开发者,且完成了微信认证的小程序(不包含境外主体)。 2、接口的开放的场景及必要性,参考国家法规、政策规定的需要“实名办理”的相关业务。具体的开放主体类目范围如下: 政务(政府和事业单位)公立医疗(含公立医疗机构的互联网医院)公立教育机构交通行业的官方企业或单位(含:航空公司、机场、客运、交通市民卡、铁路、公交、地铁、轮渡)基础运营商合规的保险公司官方快递与邮政(实名校验场景需要与支付相关联)水、电、燃、暖等官方生活缴费机构;如你的小程序主体类目所属范围、支付业务场景等,与上述相符,则可以按照对应方式申请。 3.2、申请方式 请发送邮件至官方邮箱,说明所需的场景及校验必要性,申请开通小程序的该接口的权限。官方邮箱地址:wx_city@tencent.com。邮件内容请参照下述列表: 邮件主题:申请开通“城市服务实名信息校验”接口权限+地区+单位名称 邮件内容: 1、小程序appid或原始id 2、小程序名称 3、小程序使用该接口的场景及必要性描述。 4、其他备注说明(如紧急程度、腾讯公司的对接人等) 申请资料: 1、接口申请表 2、与申请商户名称(商户号主体)完全一致的 信息系统安全等级保护三级证书(简称等保三级证书) 或者 ISO27001证的扫描件 3、签署【数据安全评估应答及承诺文件】,落款应答及承诺人为商户号主体,并盖章 4、签署【合作协议】 附:申请资料中(2)(3)(4)涉及资质,申请主体均需由商户号主体提供、签署;(3)(4),审批时请先提供填写完整的Word文档,待审批完成后再返回盖章。 附件1、微信支付实名校验接口申请表 附件2、数据安全评估应答及承诺文件 附件3、合作协议 邮件申请后,针对符合开放范围及场景必要性的小程序,会提供后续流程指引,因此申请后请留意邮件回复情况。 注意:请根据开放范围、场景所需及信息校验必要性申请本接口,并请谨慎使用。若后期使用过程中,用户举报较多或被发现在不合理使用,微信有权永久回收该小程序的该接口的权限。 四、接口文档 具体的接口文档详情,请点击此处查看详细的接口文档,并参照开发。 备注:如在使用中遇到问题,可通过官方邮箱留言,或社区留言,或评论留言方式反馈。本指引内容不定期更新,敬请留意。
2023-06-05 - 文本内容安全识别(msg_sec_check)服务端检查总是返回正确的结果?
content只有1个字的区别,但是审核的结果不一样? [图片][图片] 审核通过的返回 {"errcode":0,"errmsg":"ok","detail":[{"strategy":"content_model","errcode":0,"suggest":"pass","label":100,"prob":90},{"strategy":"keyword","errcode":0}],"trace_id":"643fb4f8-48725a95-3825f538","result":{"suggest":"pass","label":100}}
2023-04-19 - 通过微信扫描小程序码登录PC端管理后台
因业务需求,需要PC端的管理后台用户,与我们开发的内部小程序管理系统,保持用户和权限的一致性。所以考虑通过微信扫码登录获取小程序的身份。 具体业务逻辑如下: 1、PC端登录页生成当前登录的key值,带着key值请求后端接口,获取授权登录的小程序码,并轮询后端接口查看该key值对应的小程序码是否被用户扫描和授权。 2、后端生成一个带有key值参数的小程序码,并将此key值记录。 3、通过用户微信扫描小程序码,拿到对应的key值参数,将此key值和当前小程序用户的身份特征(token)传给后台,告知用户已扫描并点击登录。 4、后台标记此key值用户已登录,并记录用户登录身份,并通过PC端的轮询接口,告知其用户已登录。 5、PC端轮询到用户登录后,带着key值跳转到小程序登录中间页,在中间页PC端后台完成key值和用户信息的转换,记入session,然后跳转到对应的登录后的页面。 PC端登录页代码: function initLoginImg() { require(["md5"], function (md5) { var timestamp = md5.hash(Date.parse(new Date()) + "_" + parseInt(Math.random() * 100000)); $("#miniLoginCodeImg").html('image'); var timer = setInterval(function () { get('/api/mini.login_pc/checkLogin', {'scene': timestamp}, false, function (res) { if (res !== "0") { window.location.href = "/admin/login/mini?scene=" + timestamp; } }, function (res) { ... clearInterval(timer); }); }, 2500); }); } initLoginImg(); PC端生成小程序码: /** * 生成扫码登录小程序码 * @return Response */ public function miniLogin() { $params = $this->request->param(); $rule = [ 'scene' => 'require', ]; try { $this->validate($params, $rule); } catch (ValidateException $e) { return error($e->getMessage()); } $scene = Arr::get($params, 'scene'); $path = 'pages/landing/landing'; $cacheKeyService = CacheService::MiniLoginPC; $key = Arr::get($cacheKeyService, 'key'); $expire = Arr::get($cacheKeyService, 'expire'); Cache::set($key . $scene, '0', $expire); $optional = [ 'page' => $path, 'width' => 30 ]; $app = $this->getMiniApp(); $response = $app->app_code->getUnlimit($scene, $optional); return response($response, 200, ['Content-Type' => 'image/png'], 'html'); } 扫码登录接口: /** * 扫码登录 * @return \think\response\Json * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function scanCode() { $user = $this->request->user; $params = $this->request->param(); $rule = [ 'scene' => 'require', ]; $scene = Arr::get($params, 'scene'); $cacheService = CacheService::MiniLoginPC; $key = Arr::get($cacheService, 'key'); $isLogin = Cache::get($key . $scene); if ($isLogin != "0" && empty($isLogin)) { return error("登录失败,请重新扫码"); } try { $this->validate($params, $rule); } catch (ValidateException $e) { return error($e->getMessage()); } //1、查找系统用户是否存在 $systemUser = SystemUserModel::where('openid', '=', $user->openid)->find(); //2、用户不存在则创建 if (empty($systemUser)) { $systemUser = SystemUserService::instance()->createByWechatUser($user, $this->request); } //3、将用户写入redis $expire = Arr::get($cacheService, 'expire'); Cache::set($key . $scene, $systemUser, $expire); return success(true); } 校验用户是否扫码接口: /** * 校验用户是否扫码 */ public function checkLogin() { $params = $this->request->param(); $rule = [ 'scene' => 'require', ]; try { $this->validate($params, $rule); } catch (ValidateException $e) { return error($e->getMessage()); } $scene = Arr::get($params, 'scene'); $cacheService = CacheService::MiniLoginPC; $key = Arr::get($cacheService, 'key'); $isLogin = Cache::get($key . $scene); if ($isLogin != "0" && empty($isLogin)) { return error("登录码已过期"); } return success($isLogin); } 登录中间页: /** * 小程序登录 * @return \think\response\Redirect */ public function mini() { $params = $this->request->param(); $scene = Arr::get($params, 'scene'); if (empty($scene)) { $this->error('登录场景值为空', sysuri('admin/login')); } $cacheConfig = CacheService::MiniLoginPC; $key = Arr::get($cacheConfig, 'key') . $scene; $systemUser = Cache::get($key); if (empty($systemUser)) { $this->error('小程序码已过期,请重新扫码', sysuri('admin/login')); } if (empty($systemUser['status'])) { $this->error('该用户已禁用,请联系管理员', sysuri('admin/login')); } Session::set('user', $systemUser); Session::delete("login_input_session_error"); SystemUserModel::where('id', '=', $systemUser['id'])->update([ 'login_ip' => $this->request->ip(), 'login_at' => date('Y-m-d H:i:s'), 'login_num' => Db::raw('login_num+1'), ]); sysoplog('用户登录', '登录系统后台成功'); return redirect('/admin'); }
2022-04-12