收藏
回答

html页面ios系统调用不了requestWxFacePictureVerify,安卓就没问题?

我先是调用checkIsSupportFaceDetect检查是否支持人脸识别,返回支持后才调用requestWxFacePictureVerify进行人脸识别,安卓没有问题,ios系统一直调不起,返回requestWxFacePictureVerify:fail,返回err_code的值为undefined

代码如下:

wx.ready(function () {

      wx.invoke('checkIsSupportFaceDetect', {

      }, function (res) {

        if (res.err_code == 0) {

          wx.invoke('requestWxFacePictureVerify', {

            "appid": "wx03987249d26e8aa8",

            "request_verify_pre_info": { 'name': name, 'id_card_number': id_card_number },

            "checkAliveType": 2

          }, function (ss) {

            if (ss.err_code == 0) {

              alert(ss.err_code);

            } else {

              alert(ss.err_code);

              alert(ss.err_msg);

              alert(ss.lib_version_code);

              $.toptip(ss.err_msg, 2000, "error");

              return;

            }

          })

        } else {

          $.toptip("该设备不支持人脸识别!", 2000, "error");

          return;

        }

      })

    })

  }

回答关注问题邀请回答
收藏

2 个回答

  • 李泳江(恒)
    李泳江(恒)
    2020-05-12

    具体代码如下:

    <!DOCTYPE html>

    <html lang="en">

    <head>

      <meta charset="UTF-8">

      <meta name="viewport" content="width=device-width, initial-scale=1.0">

      <meta http-equiv="X-UA-Compatible" content="ie=edge">

      <title>人脸识别认证</title>

      <link rel="stylesheet" href="../../common/common.css">

      <link rel="stylesheet" href="../../lib/weui.min.css">

      <link rel="stylesheet" href="../../lib/jquery-weui.min.css">

      <style>

        body {

          background-color: #ededed;

          height: 100%;

          overflow: hidden;

        }

      </style>

    </head>

    <body>

      <div style="text-align: center; padding: 30px 0;">

        <img id="userIcon" src="../../images/user.png" style="width: 80px; height: 80px; border-radius: 50%;">

      </div>

      <div class="weui-cells weui-cells_form" style="margin: 0 0 20px 0;">

        <div class="weui-cell">

          <div class="weui-cell__bd">

            <input class="weui-input" id="name" placeholder="真实姓名">

          </div>

        </div>

        <div class="weui-cell">

          <div class="weui-cell__bd">

            <input class="weui-input" id="id_card_number" placeholder="身份证号">

          </div>

        </div>

      </div>

      <button style="width: 94%; margin: 0 auto;" onclick="login()" type="button"

        class="weui-btn weui-btn_primary">下一步</button>

    </body>

    <script src="../../common/path.js"></script>

    <script src="../../common/common.js"></script>

    <script src="../../lib/jquery-1.11.1.min.js"></script>

    <script src="../../lib/jquery-weui.min.js"></script>

    <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

    <script>

      function init() {

        $.ajax({

          url: _path + '/wechat/mp/portal/getJsapiSignature?url=' + encodeURIComponent(window.location.href),

          type: "get",

          contentType: 'application/json',

          success: function (res) {

            res.debug = false;

            res.jsApiList = [

              'checkIsSupportFaceDetect',

              'requestWxFacePictureVerify'

            ];

            res.beta = true;

            wx.config(res);

          }

        });

      }

      init();


      function login() {

        var name = $.trim($("#name").val());

        if (name === "") {

          $.toptip("真实姓名不能为空", 2000, "error");

          return;

        }

        var id_card_number = $.trim($("#id_card_number").val());

        if (id_card_number === "") {

          $.toptip("身份证号不能为空", 2000, "error");

          return;

        } else {

          if (!carIdNumber(id_card_number)) {

            $.toptip("身份证号格式不正确", 2000, "error");

            return;

          }

        }


        wx.ready(function () {

          wx.invoke('checkIsSupportFaceDetect', {


          }, function (res) {

            if (res.err_code == 0) {

              wx.invoke('requestWxFacePictureVerify', {

                "appid": "wx03987249d26e8aa8",

                "request_verify_pre_info": { 'name': name, 'id_card_number': id_card_number },

                "checkAliveType": 2

              }, function (ss) {

                if (ss.err_code == 0) {

                  alert("识别成功")

                } else {

                  alert(ss.err_code);

                  alert(ss.err_msg);

                  alert(ss.lib_version_code);

                  $.toptip(ss.err_msg, 2000, "error");

                  return;

                }

              })

            } else {

              $.toptip("该设备不支持人脸识别!", 2000, "error");

              return;

            }

          })

        })

      }

      function carIdNumber(value) {

        var vcity = {

          11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古",

          21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏",

          33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南",

          42: "湖北", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆",

          51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西", 62: "甘肃",

          63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外"

        };

        var checkCard = function () {

          var card = value;

          //是否为空

          if (card === '') return false;

          //校验长度,类型

          if (isCardNo(card) === false) return false;

          //检查省份

          if (checkProvince(card) === false) return false;

          //校验生日

          if (checkBirthday(card) === false) return false;

          //检验位的检测

          if (checkParity(card) === false) {

            return false;

          }

          return true;

        };

        //检查号码是否符合规范,包括长度,类型

        var isCardNo = function (card) {

          //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X

          var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;

          if (reg.test(card) === false) {

            return false;

          }

          return true;

        };

        //取身份证前两位,校验省份

        var checkProvince = function (card) {

          var province = card.substr(0, 2);

          if (vcity[province] == undefined) {

            return false;

          }

          return true;

        };

        //检查生日是否正确

        var checkBirthday = function (card) {

          var len = card.length;

          //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字

          if (len == '15') {

            var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;

            var arr_data = card.match(re_fifteen);

            var year = arr_data[2];

            var month = arr_data[3];

            var day = arr_data[4];

            var birthday = new Date('19' + year + '/' + month + '/' + day);

            return verifyBirthday('19' + year, month, day, birthday);

          }

          //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X

          if (len == '18') {

            var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;

            var arr_data = card.match(re_eighteen);

            var year = arr_data[2];

            var month = arr_data[3];

            var day = arr_data[4];

            var birthday = new Date(year + '/' + month + '/' + day);

            return verifyBirthday(year, month, day, birthday);

          }

          return false;

        };

        //校验日期

        var verifyBirthday = function (year, month, day, birthday) {

          var now = new Date();

          var now_year = now.getFullYear();

          //年月日是否合理

          if (birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day) {

            //判断年份的范围(3岁到100岁之间)

            var time = now_year - year;

            if (time >= 3 && time <= 100) {

              return true;

            }

            return false;

          }

          return false;

        };

        //校验位的检测

        var checkParity = function (card) {

          //15位转18位

          card = changeFivteenToEighteen(card);

          var len = card.length;

          if (len == '18') {

            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

            var cardTemp = 0, i, valnum;

            for (i = 0; i < 17; i++) {

              cardTemp += card.substr(i, 1) * arrInt[i];

            }

            valnum = arrCh[cardTemp % 11];

            if (valnum == card.substr(17, 1)) {

              return true;

            }

            return false;

          }

          return false;

        };

        //15位转18位身份证号

        var changeFivteenToEighteen = function (card) {

          if (card.length == '15') {

            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

            var cardTemp = 0, i;

            card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);

            for (i = 0; i < 17; i++) {

              cardTemp += card.substr(i, 1) * arrInt[i];

            }

            card += arrCh[cardTemp % 11];

            return card;

          }

          return card;

        };

        return checkCard();

      };

    </script>

    </html>

    2020-05-12
    有用
    回复
  • 疯狂的小辣椒
    疯狂的小辣椒
    2020-05-11

    你好,麻烦具体描述问题流程,提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html

    2020-05-11
    有用
    回复 4
    • 李泳江(恒)
      李泳江(恒)
      2020-05-12
      我的机型是:iPhone11,微信版本号是:7.0.12,系统版本号是:13.4.1。
      我开发的是公众号网页而不是小程序哦,这怎么做复现问题代码片段?
      具体的流程是:
      1、点击人脸识别按钮,进入填写姓名和身份证号码页面
      2、点击下一步时先调用checkIsSupportFaceDetect判断设备是否支持人脸识别
      3、判断是后调用requestWxFacePictureVerify调起人脸识别页面。
      到这一步后,安卓手机没有问题可以调出人脸识别页面,ios系统就调不出识别页面,ios系统调用requestWxFacePictureVerify后返回的数据如下:
      {
      err_code: undefined,
      err_msg: requestWxFacePictureVerify:fail,
      verify_result: undefined
      }
      2020-05-12
      回复
    • 灵芝
      灵芝
      2020-05-12回复李泳江(恒)
      请检查是否字符串格式,”request_verify_pre_info” 的 ios 需要转换成字符串json格式 ,双引号
      2020-05-12
      回复
    • 李泳江(恒)
      李泳江(恒)
      2020-05-19
      是的,已经解决了,把”request_verify_pre_info“的内容换成json字符串就行了,"request_verify_pre_info": JSON.stringify({ 'name': name, 'id_card_number': id_card_number }),太坑了这问题!
      2020-05-19
      1
      回复
    • Dimensin🍃
      Dimensin🍃
      2022-09-28回复李泳江(恒)
      安卓也用json可以吗
      2022-09-28
      回复
登录 后发表内容
问题标签