精华内容
下载资源
问答
  • 实现方式主要通过以下模块实现:DateFromWebChat (从网页版微信窗口下载好友头像)AI (识别模块,主要用于识别好友头像是否为人脸,并且计算人脸的数量与头像的总数且return)DateVisul (数据可视化模块,用与AI模块...

    实现方式主要通过以下模块实现:

    DateFromWebChat (从网页版微信窗口下载好友头像)

    AI (识别模块,主要用于识别好友头像是否为人脸,并且计算人脸的数量与头像的总数且return)

    DateVisul (数据可视化模块,用与AI模块返回参数的可视化)

    union(将整合以上三个模块的顶层模块)

    知识准备:

    python中opencv图像处理模块的使用(主要是CascadeClassifier级联图像分类器与 detectMultiScale人脸识别函数的使用)

    python中os模块的使用(主要涉及os.imread灰度图像处理与os.listdir(path)获取路径下文件这两个函数的使用)

    sys模块的使用(sys.stdout.flush()缓冲器一次返回一个值)

    python中Matplotlib图形框架的使用(涉及饼图plt.pie的使用与使用matplotlib.font_manager.FontProperties设置文字显示方式)

    知识解析:

    #需要导入的包

    import itchat

    import os

    import cv2

    import matplotlib.pyplot as plt

    import matplotlib.font_manager

    import sys

    #DateFromWebChat模块完整代码

    class DataFromWebchat:

    def __init__(self,facedir):

    self.facedir = facedir #接收图像文件目录

    pass

    def downloadFriendFaces(self):

    print('开始登陆.......')

    itchat.auto_login(hotReload=True)

    print('开始获取好友列表.....')

    friends = itchat.get_friends()

    print('开始下载好友头像.....')

    count = 0

    for friend in friends:

    print('.',end='')

    if (count+1)%60==0:

    print()

    sys.stdout.flush()

    username = friend['UserName']

    filename = self.facedir + 'face%05d.png'%(count)#设置文件名

    with open(filename,'wb') as fd:

    faceDate = itchat.get_head_img(userName=username)#获取头像

    fd.write(faceDate)

    count+=1

    print('好友头像下载完毕!')

    #完整人脸识别代码如下

    class AI:

    def __init__(self,facedir):

    # 创建一个分类器并且初始化

    self.facedir = facedir

    self.classtool = cv2.CascadeClassifier('C:\\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\\cv2\\data\\haarcascade_frontalface_alt.xml')

    #注意人脸分类器的参数路劲必须是绝对路劲不能是相对路劲否则error

    def recognize(self):

    sum = 0 #记录头像总数

    facenum = 0 #记录人脸总数

    # 遍历图像识别是否为人脸

    print('开始识别是否为人脸.........')

    files = os.listdir(self.facedir)#获取路径下所有文件

    for file in files:

    if (sum + 1) % 60 == 0:

    print()

    file = self.facedir + file

    if os.path.splitext(file)[1]== '.png':

    img = cv2.imread(file) #图像灰度处理

    # print('img=',img)

    faces = self.classtool.detectMultiScale(image=img, scaleFactor=1.2, minNeighbors=5)

    #第一个参数为传入灰度图像,第二个我小矩形放缩比率,第三个为,确定小矩形需满足的数目

    if len(faces) > 0:

    facenum += 1

    print('\033[33m.\033[0m', end='')

    else:

    print('\033[34mx\033[0m', end='')

    sys.stdout.flush()

    sum +=1

    print('头像识别完毕!!!!!')

    return (sum,facenum) #返回参数用于DateVisual模块使用

    #完整可视化模块如下

    class VisualDate:

    def __init__(self):

    self.font = matplotlib.font_manager.FontProperties(fname=r'c:\windows\fonts\simsun.ttc')

    plt.figure(figsize=(9,6),dpi=80)

    plt.axes(aspect=1) # set this , Figure is round, otherwise it is an ellipse

    print('数据可视化。。。。')

    def visualround(self,data):

    sum = data[0]

    facenum = data[1]

    pie = plt.pie((100.0*facenum/sum,100.0*(sum-facenum)/sum),#计算圆饼图频率

    labels=('使用人脸做头像','不使用人脸做头像'),#设置图形边界的说明标签

    colors=('yellow','purple'),#颜色设置饼图的

    labeldistance=1.1,#设置标签距离中心点的距离

    autopct='%5.2f%%',#设置频率的数字格式

    shadow=False, #设置是否有阴影

    startangle=0, #画图的其实角度

    pctdistance=0.6) #设置饼图距离原点的距离

    for temp in pie[1]:

    temp.set_fontproperties(self.font)#把标签元组元素提取出来设置字符集

    plt.title('微信好友使用人脸头像情况(总数=%d)' % data[0], fontproperties=self.font)#设置图形标题

    plt.show()#显示图形

    #union模块完整代码如下

    class union:

    date = DataFromWebchat(FECEDIR) #实例化类

    MyAi = AI(FECEDIR) #实例化AI类

    visual = VisualDate()#实例化类

    def analysis(self):

    self.date.downloadFriendFaces()

    sum,facenum = self.MyAi.recognize()#提取参数

    self.visual.visualround((sum,facenum))

    print(sum,facenum)

    run = union()

    run.analysis()

    代码运行效果截图:

    3907dd5861fc?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq

    visual.PNG

    微信好友图片下载截图:

    3907dd5861fc?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq

    111.PNG

    展开全文
  • 微信公众号人脸核身接口接入指南(调用微信人脸识别验证api) 前篇写过项目中接入支付宝身份验证接口,用于web网页端的文章。我们这个项目又需要做微信公众号,支付宝的接口自然是无法使用了,然后就查找微信有没有...

    微信公众号人脸核身接口接入指南(调用微信人脸识别验证api)

    前篇写过项目中接入支付宝身份验证接口,用于web网页端的文章。我们这个项目又需要做微信公众号,支付宝的接口自然是无法使用了,然后就查找微信有没有这种接口。很多有这种需求的小伙伴,肯定也跟我一样,知道有这个接口,但是找不到文档、不知道是否适用公众号、不知道如何申请。所以,就将我如何申请的供需要的人查阅。

    内容已移至公众号,关注走一波:
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • Android 微信人脸识别+微信二维码

    千次阅读 2020-09-29 17:24:55
    前言:公司需要做一个人脸识别项目。用户点击商品 》 选择支付方式 》 微信人脸支付或微信、支付宝二维码支付。但不是我们的后端来和我合作,我需要自己去微信官方拿rawdata和AuthInfo(需要注意的是微信的接口请求...

    前言:公司需要做一个人脸识别项目。用户点击商品 》 选择支付方式 》 微信人脸支付或微信、支付宝二维码支付。但不是我们的后端来和我合作,我需要自己去微信官方拿rawdata和AuthInfo(需要注意的是微信的接口请求都是XML请求

     

    微信人脸支付

    1.选择设备。微信人脸需要选择微信官方提供的设备

    微信人脸设备展示

    2.商户APP Demo。仔细查看demo中的人脸支付流程。(demo中的流程同样是不需要有后端的,需要的参数都需要自己去微信要)

    商户APP Demo(查看的是商户APP Demo)

    微信刷脸支付文档 # 刷脸支付场景说明

    3.把wxfacepay-release加到libs中。

    4.Application中微信人脸SDK初始化

        private fun initWxpayface() {
            val m1: Map<String?, String?> = HashMap()
    //      m1.put("ip", "192.168.1.1"); //若没有代理,则不需要此行
    //      m1.put("port", "8888");//若没有代理,则不需要此行
    //      m1.put("user", mEtnUser.getText().toString());//若没有代理,则不需要此行
    //      m1.put("passwd", mEtnPassword.getText().toString());//若没有代理,则不需要此行
    //      m1.put("proxy_type", 1 ); //若没有代理,则不需要此行
    //      m1.put("perform_mode", "LOW_PERFORM");//低性能表现,默认关闭美颜等
            WxPayFace.getInstance().initWxpayface(this, m1, object : IWxPayfaceCallback() {
                @Throws(RemoteException::class)
                override fun response(info: Map<*, *>?) {
                    if (info == null) {
                        e("调用返回为空, 请查看日志")
                        RuntimeException("调用返回为空").printStackTrace()
                        return
                    }
                    val code = info["return_code"] as String?
                    val msg = info["return_msg"] as String?
                    e("初始化完成")
                }
            })
        }

    5.获取rawdata。getWxpayfaceRawdata

            /**
             *	获取rawdata
             */
            WxPayFace.getInstance().getWxpayfaceRawdata(object : IWxPayfaceCallback() {
    
                override fun response(info: Map<*, *>?) {
                    if (info == null) {
                        e("调用返回为空, 请查看日志")
                        java.lang.RuntimeException("调用返回为空").printStackTrace()
                        return
                    }
                    val code = info["return_code"] as String?
                    val msg = info["return_msg"] as String?
                    val rawData = info["rawdata"] as String?
                    e(rawData)
                    getAuthInfo(rawData)
                }
            })

    6.获取AuthInfo。https://payapp.weixin.qq.com/face/get_wxpayface_authinfo

       private fun getAuthInfo(rawData: String?) {
            var map = mutableMapOf<String, String>()
            map["rawdata"] = rawData!!
            //门店编号
            map["store_id"] = Constance.store_id
            //门店名称
            map["store_name"] = Constance.store_name
            //终端设备编号,由商户定义。
            map["device_id"] = Constance.device_id
            //商户号绑定的公众号/小程序 appid
            map["appid"] = orderInfoBean!!.data.wxappid
            //	商户号
            map["mch_id"] = orderInfoBean!!.data.wxmchid
            //版本号:固定是1
            map["version"] = "1"
            var now = (System.currentTimeMillis() / 1000).toString()
            map["now"] = now
            map["sign_type"] = "MD5"
            map["nonce_str"] = Constance.nonce_str
    
            //按字典顺序排序
            val infoIds: List<Map.Entry<String, String>> =
                ArrayList(map.entries)
            Collections.sort(infoIds, { o1, o2 -> o1.key.compareTo(o2.key) })
            //使用&符号进行拼接
            val sbR: String =
                Tools.getStringBuffer(infoIds).toString() + "&key=" + orderInfoBean!!.data.wxmchkey
            //进行MD5加密之后  转大写
            val sign: String = Tools.encode(sbR).toUpperCase()
            map["sign"] = sign
    
    
            /*将map集合转为xml*/
            val toXml = Tools.mapToXml(map)
    //        e("认证参数XMl$toXml")
            val body = RequestBody.create(null, toXml)
    
            e(toXml.toString())
    
            OkGo.post<String>(UrlUtils.WECHAT)
                .tag(UrlUtils.WECHAT)
                .upRequestBody(body)
                .execute(object : StringCallback() {
                    override fun onError(response: com.lzy.okgo.model.Response<String?>?) {
                        e("获取到的微信支付凭证${response!!.body()}")
                    }
    
                    override fun onSuccess(response: com.lzy.okgo.model.Response<String?>?) {
                        val payVoucher = response!!.body()!!
                        val headers = response.headers()!!
    
                        try {
                            var code = Tools.parseGetAuthInfoXML(payVoucher, "return_code")
                            if ("SUCCESS" == code) {
                                val authinfo: String = Tools.parseGetAuthInfoXML(payVoucher, "authinfo")
                                pay(authinfo)
                            } else {
                                val msg: String = Tools.parseGetAuthInfoXML(payVoucher, "return_msg")
                                e("获取微信凭证失败$msg")
                            }
                        } catch (e: Exception) {
                            e.printStackTrace()
                            e("获取微信凭证失败$e")
                        }
                    }
                })
        }

    7.调起微信人脸识别。进行人脸识别getWxpayfaceCode(获取用户信息facecode)

        private fun pay(mAuthInfo: String?) {
            e("pay", "onClick | pay ")
    
            var params: HashMap<String, String> = HashMap()
    
            //FACEPAY: 人脸凭证,常用于人脸支付
            params["face_authtype"] = "FACEPAY"
    
            //商户号绑定的公众号/小程序 appid
            params["appid"] = orderInfoBean!!.data.wxappid
            //	商户号
            params["mch_id"] = orderInfoBean!!.data.wxmchid
            //门店编号
            params["store_id"] = Constance.store_id
            //目标face_code类型,可选值:"1",刷卡付款码:18位数字,通过「付款码支付/被扫支付」接口完成支付。如果不填写则默认为"0"
            params["face_code_type"] = "1"
            //支付成功页是否需要展示人脸识别授权项。 展示:1 不展示:0
            params["ask_face_permit"] = "0"
            //商户端是否对SDK返回支付结果,可选值:"0",返回支付结果,商户需在确认?付结果后调?[updateWxpayfacePayResult]通知SDK;"1"
            params["ignore_update_pay_result"] = "1"
            //	指定刷脸界面的运行屏幕,可选值:“0”, 运行在默认屏幕; "1", 运行在第二屏幕(副屏); "2", 自动选择屏幕; "3", 强制用presentation方式在第二屏幕(副屏)启动。
            params["screen_index"] = "0"
            //商户订单号,须与调用支付接口时字段一致
            params["out_trade_no"] = orderInfoBean!!.data.order_number
            //订单金额(数字)
            params["total_fee"] = allPrice.times(100).toInt().toString()
            params["authinfo"] = mAuthInfo.toString()
    
    
            e("pay | single callback")
            WxPayFace.getInstance().getWxpayfaceCode(params, object : IWxPayfaceCallback() {
                @Throws(RemoteException::class)
                override fun response(info: Map<*, *>?) {
                    if (info != null) {
                        e(info.toString())
                        getWxfaceCode(info)
                    } else
                        e("调用返回为空, 请查看日志")
                }
            }, object : IWxPayfaceCallback() {
                override fun response(info: MutableMap<Any?, Any?>?) {
                    e(info.toString())
                    if (info == null) {
                        RuntimeException("调用返回为空").printStackTrace()
                        return
                    }
                    val code = info["return_code"] as String // 错误码
                    val msg = info["return_msg"] as String // 错误码描述
    
                    if (code == null || code != "SUCCESS") {
                        RuntimeException("调用返回非成功信息,return_msg:$msg   ")
                            .printStackTrace()
                        return
                    }
                }
            })
        }
    
        private fun getWxfaceCode(info: Map<*, *>) {
            val code = info["return_code"] as String?
            val facecode = info["face_code"] as String?
            when {
                //用户确认支付
                TextUtils.equals(code, WxfacePayCommonCode.VAL_RSP_PARAMS_SUCCESS) ->
                    doPay(facecode)
    
                TextUtils.equals(code, WxfacePayCommonCode.VAL_RSP_PARAMS_USER_CANCEL) ->
                    e("用户取消")
    
                TextUtils.equals(code, WxfacePayCommonCode.VAL_RSP_PARAMS_SCAN_PAYMENT) ->
                    e("扫码支付")
    
                TextUtils.equals(code, WxfacePayCommonCode.VAL_RSP_PARAMS_ERROR) ->
                    e("发生错误")
    
                TextUtils.equals(code, WxfacePayCommonCode.VAL_RSP_PARAMS_USER_QUERY_CANCEL) ->
                    e("请与商户确认支付结果")
            }
        }

    8.进行发起订单支付micropay。接口地址:https://api.mch.weixin.qq.com/pay/micropay

        private fun doPay(facecode: String?) {
            var map = mutableMapOf<String, String>()
    
            map["auth_code"] = facecode.toString()
            map["spbill_create_ip"] = "192.168.0.143"
            map["body"] = "捷视商品"
            map["attach"] = "订单额外描述"
            map["device_info"] = Constance.device_id
            map["sign_type"] = "MD5"
            map["total_fee"] = allPrice.times(100).toInt().toString()
    
            map["out_trade_no"] = orderInfoBean!!.data.order_number
    
            //商户号绑定的公众号/小程序 appid
            map["appid"] = orderInfoBean!!.data.wxappid
            //	商户号
            map["mch_id"] = orderInfoBean!!.data.wxmchid
    
            var now = (System.currentTimeMillis() / 1000).toString()
            map["time_start"] = now
    
            map["nonce_str"] = Constance.nonce_str
    
    
            //按字典顺序排序
            val infoIds: List<Map.Entry<String, String>> = ArrayList(map.entries)
            Collections.sort(infoIds) { o1, o2 -> o1.key.compareTo(o2.key) }
            //使用&符号进行拼接商户Key
            val sbR: String =
                Tools.getStringBuffer(infoIds).toString() + "&key=" + orderInfoBean!!.data.wxmchkey
            //进行MD5加密之后  转大写
            val sign: String = Tools.encode(sbR).toUpperCase()
            map["sign"] = sign
    
            e(map.toString())
    
    
            /*将map集合转为xml*/
            val toXml = Tools.mapToXml(map)
    //        e("认证参数XMl$toXml")
            val body = RequestBody.create(null, toXml)
    
            OkGo.post<String>("https://com.api.mch.weixin.qq.com/pay/micropay")
                .tag(this)
                .upRequestBody(body)
                .execute(object : StringCallback() {
                    override fun onError(response: com.lzy.okgo.model.Response<String?>?) {
                        e("获取微信支付${response!!.body()}")
                    }
    
                    override fun onSuccess(response: com.lzy.okgo.model.Response<String?>?) {
                        val payVoucher = response!!.body()!!
                        val headers = response.headers()!!
                        e("微信支付${payVoucher}")
    
                        try {
                            var code = Tools.parseGetAuthInfoXML(payVoucher, "return_code")
                            var resultCode = Tools.parseGetAuthInfoXML(payVoucher, "result_code")
                            var msg = Tools.parseGetAuthInfoXML(payVoucher, "return_msg")
                            if ("SUCCESS" == code) {
                                if ("SUCCESS" == resultCode) {
                                    //支付成功,返回,告诉后端我们支付成功了,把支付成功参数给后台
                                    returServerCode(payVoucher)
                                } else {
                                    queryPay()
                                }
                            } else {
                                e("微信支付失败$msg")
                            }
                        } catch (e: Exception) {
                            e.printStackTrace()
                            e("微信支付失败$e")
                        }
                    }
                })
        }

    9.因为微信的人脸支付没有“notify_url”参数,所以需要我们主动去给后台消息说我们支付成功了。有时候微信给我们的订单支付成功消息不是SUCCESS,而是SYSTEMERROR(系统超时)(我有时候遇到了这种情况,用户明明付款成功了,但是返回的不是SUCCESS),所以我们要主动去查询订单一次

    查询订单状态orderquery。接口地址:https://api.mch.weixin.qq.com/pay/orderquery

        private fun returServerCode(payVoucher: String) {
            //微信支付订单号
            var transactionid = Tools.parseGetAuthInfoXML(payVoucher, "transaction_id")
            var openid = Tools.parseGetAuthInfoXML(payVoucher, "openid")
            var totalfee = Tools.parseGetAuthInfoXML(payVoucher, "total_fee")
    
            var map = mutableMapOf<String, String>()
            map["api_name"] = "wxFaceNotify"
            map["shop_id"] = orderInfoBean!!.data.shop_id
            map["order_id"] = orderInfoBean!!.data.order_id
            map["order_number"] = orderInfoBean!!.data.order_number
            map["transaction_id"] = transactionid
            map["openid"] = openid
            map["total_fee"] = (totalfee.toDouble() / 100).toString()
    
            e(map.toString())
    
            OkGo.post<String>(UrlUtils.SHOPLIST)
                .tag(this)
                .params(map)
                .execute(object : StringCallback() {
                    override fun onError(response: com.lzy.okgo.model.Response<String?>?) {
                        ToastUtil.showTextToast("网络连接失败请重试!!")
                    }
    
                    override fun onSuccess(response: com.lzy.okgo.model.Response<String?>?) {
                        e(response!!.body()!!)
                    }
                })
        }

    微信二维码(NATIVE支付)

    获取微信二维码要开启NATIVE支付,我们要去统一下单中获取二维码

    微信统一下单API

    URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder

       private fun showWeChatCodePay(payType: Int) {
            var map = mutableMapOf<String, String>()
    
            //商户号绑定的公众号/小程序 appid
            map["appid"] = orderInfoBean!!.data.wxappid
            //	商户号
            map["mch_id"] = orderInfoBean!!.data.wxmchid
            //	商户号
            map["device_info"] = MyApplication.IMEI.toString()
            //	商户系统内部订单号
            map["out_trade_no"] = orderInfoBean!!.data.order_number
            //	商户系统内部ID
            map["product_id"] = orderInfoBean!!.data.order_id
            //随机字符串
            map["nonce_str"] = Constance.nonce_str
            //商品描述
            map["body"] = "捷视商品"
            //订单金额(数字)
            map["total_fee"] = allPrice.times(100).toInt().toString()
            //终端IP
            map["spbill_create_ip"] = "192.168.0.143"
            //通知地址
            map["notify_url"] = "http://www.jieshishop.com/Wxsite/Wxpay/wxf2fNotify"
            //交易类型
            map["trade_type"] = "NATIVE"
    
            //按字典顺序排序
            val infoIds: List<Map.Entry<String, String>> =
                ArrayList(map.entries)
            Collections.sort(infoIds) { o1, o2 -> o1.key.compareTo(o2.key) }
            //使用&符号进行频率
            val sbR: String =
                Tools.getStringBuffer(infoIds).toString() + "&key=" + orderInfoBean!!.data.wxmchkey
            //进行MD5加密之后  转大写
            val sign: String = Tools.encode(sbR).toUpperCase()
            map["sign"] = sign
    
            e(map.toString())
    
            /*将map集合转为xml*/
            val toXml = Tools.mapToXml(map)
            //        e("认证参数XMl$toXml")
            val body = RequestBody.create(null, toXml)
    
            e(toXml.toString())
    
            OkGo.post<String>("https://api.mch.weixin.qq.com/pay/unifiedorder")
                .tag(this)
                .upRequestBody(body)
                .execute(object : StringCallback() {
                    override fun onError(response: com.lzy.okgo.model.Response<String?>?) {
                        e("微信二维码支付失败${response!!.body()}")
                    }
    
                    override fun onSuccess(response: com.lzy.okgo.model.Response<String?>?) {
                        val payVoucher = response!!.body()
                        try {
                            var msg = Tools.parseGetAuthInfoXML(payVoucher, "return_msg")
                            var code = Tools.parseGetAuthInfoXML(payVoucher, "return_code")
                            var resultCode = Tools.parseGetAuthInfoXML(payVoucher, "result_code")
                            var codeUrl = Tools.parseGetAuthInfoXML(payVoucher, "code_url")
    
                            if ("SUCCESS" == code) {
                                if ("SUCCESS" == resultCode) {
                                    //支付成功
                                    dialog = PayCodeDialog(mContext, payType, codeUrl)
                                    dialog!!.show()
                                }
                            } else {
                                ToastUtil.showTextToast("微信二维码支付失败:$msg")
                            }
                        } catch (e: Exception) {
                            e.printStackTrace()
                            ToastUtil.showTextToast("微信二维码支付失败:$e")
                        }
                    }
                })
        }

    Tools 工具类:

    public class Tools {
    
        /**
         *      * 将Map转换为XML格式的字符串
         *      *
         *      * @param data Map类型数据
         *      * @return XML格式的字符串
         *      * @throws Exception
         *      
         */
        public static String mapToXml(Map<String, String> data) throws Exception {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            org.w3c.dom.Document document = documentBuilder.newDocument();
            org.w3c.dom.Element root = document.createElement("xml");
            document.appendChild(root);
            for (String key : data.keySet()) {
                String value = data.get(key);
                if (value == null) {
                    value = "";
                }
                value = value.trim();
                org.w3c.dom.Element filed = document.createElement(key);
                filed.appendChild(document.createTextNode(value));
                root.appendChild(filed);
            }
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            DOMSource source = new DOMSource(document);
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            StringWriter writer = new StringWriter();
            StreamResult result = new StreamResult(writer);
            transformer.transform(source, result);
            String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
            try {
                writer.close();
            } catch (Exception ex) {
            }
            return output;
        }
    
        /**
         * 拼接
         *
         * @param infoIds
         * @return
         */
        @NonNull
        public static String getStringBuffer(List<Map.Entry<String, Object>> infoIds) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < infoIds.size(); i++) {
                Map.Entry<String, Object> stringStringEntry = infoIds.get(i);
                if (stringStringEntry.getKey() == null) {
                    stringStringEntry.getKey();
                }
                String key = stringStringEntry.getKey();
                Object val = stringStringEntry.getValue();
                if (i != infoIds.size() - 1) {
                    if (val != null && !TextUtils.equals("", val.toString())) {
                        sb.append(key).append("=").append(val).append("&");
                    }
                } else {
                    if (val != null && !TextUtils.equals("", val.toString())) {
                        sb.append(key).append("=").append(val);
                    }
                }
            }
            return sb.toString();
        }
    
        /**
         * 作 者: yzhg
         * 历 史: (版本) 1.0
         * 描 述: md5加密
         */
        public static String encode(String password) {
            try {
                MessageDigest digest = MessageDigest.getInstance("md5");
                byte[] result = digest.digest(password.getBytes());
                StringBuilder sb = new StringBuilder();
                for (byte b : result) {
                    int number = b & 0xff;
                    String str = Integer.toHexString(number);
                    if (str.length() == 1) {
                        sb.append("0");
                    }
                    sb.append(str);
                }
                return sb.toString();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                return "";
            }
        }
    
        public static String parseGetAuthInfoXML(String resultText, String indexText) throws Exception {
            InputStream is = new ByteArrayInputStream(resultText.getBytes());
            String result = null;
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(is, "UTF-8");
    
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if (parser.getName().equals(indexText)) {
                            eventType = parser.next();
                            result = parser.getText();
                        }
                }
                eventType = parser.next();
            }
            return result;
        }
    
    }

     

    展开全文
  • 官方链接:微信人脸核身接口能力 符合开通条件即可支持开通,目前使用不收费,后续是否收费的问题请关注开通规范,如有收费信息将会在官方渠道通知。 申请 具体申请流程参照上方连接查看 开通小程序后台的接口...

    摘要

    微信小程序使用人脸识别,只支持微信自己开放的接口。使用第三方的,微信会审核不通过。后续如果开放第三方,请麻烦您留言告诉我。

    目前并未全面开放,特定的主体类目+邮件形式申请开放。具体参考下方官方发布的查看。
    官方链接:微信人脸核身接口能力

    符合开通条件即可支持开通,目前使用不收费,后续是否收费的问题请关注开通规范,如有收费信息将会在官方渠道通知。

    在这里插入图片描述

    申请

    具体申请流程参照上方连接查看

    开通小程序后台的接口权限入口后,开发者可以通过公众平台mp.weixin.qq.com登录小程序账号,在“开发-接口设置”中,添加可用类目开通接口。即可按照下述方式,开发调试试用接口。

    实现

    一、获取本机支持的 SOTER 生物认证方式

    判断当前手机是否支持 指纹识别、人脸识别,以便于做不同的处理。

    文档

    wx.checkIsSupportSoterAuthentication(Object object)

    示例代码
    wx.checkIsSupportSoterAuthentication({
      success(res) {
        // res.supportMode = [] 不具备任何被SOTER支持的生物识别方式
        // res.supportMode = ['fingerPrint'] 只支持指纹识别
        // res.supportMode = ['fingerPrint', 'facial'] 支持指纹识别和人脸识别
      }
    })
    
    二、请求进行基于生物识别的人脸核身

    此接口在申请之后开放,官方文档上查不到
    wx.startFacialRecognitionVerify(OBJECT)

    参数类型必填说明
    nameString姓名
    idCardNumberString身份证号码
    successFunction调用成功回调
    failFunction调用失败回调
    completeFunction调用完成回调(成功或失败都会回调)
    checkAliveTypeNumber人脸核验的交互方式,默认读数字。为2时,先检查是否可以屏幕闪烁,不可以则自动为读数字
    返回参数
    参数类型说明
    errMsgString错误信息
    errCodeNumber错误码
    verifyResultString本次认证结果凭据,第三方可以选择根据这个凭据获取相关信息
    回调结果说明

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    示例代码:
    wx.startFacialRecognitionVerify({
    	name:'张三',
    	idCardNumber:'123456789012345678',
    	success(res){
    	
    	},
    	fail(err){
    	
    	}
    })
    
    三、再次获取核验结果api(后端获取用户的信息数据,前端传参verify_result,以下都是后端处理)

    此接口是前端完成人脸核身后,基于前端返回的凭据,通过后台api再次进行核验结果的校验、确认之用。有助于提高安全性,请接入。

    1、说明

    人脸核身之后,开发者可以根据jsapi返回的verify_result向后台拉取当次认证的结果信息。

    2、请求URL

    https://api.weixin.qq.com/cityservice/face/identify/getinfo?access_token={access_token}

    3、请求数据说明
    参数类型是否必填描述
    verify_resultStringjsapi返回的加密key(凭据)

    获取access_token

    4、返回参数说明
    参数类型描述
    errcodeint错误码, 0表示成功
    errmsgstring错误信息
    identify_retint认证结果
    identify_timeuint32认证时间
    validate_datastring用户读的数字(如是读数字)
    openidstring用户openid
    user_id_keystring用于后台交户表示用户姓名、身份证的凭证
    finish_timeuint32认证结束时间
    id_card_number_md5string身份证号的md5(最后一位X为大写)
    name_utf8_md5string姓名MD5
    5、错误码对应信息
    errcode备注
    84001非法identity_id
    84002用户信息过期
    84003用户信息不存在
    展开全文
  • 其实不止百度人脸识别接口,调用其他API接口也是同样道理,项目上线之后发现接口报错https://aip.baidubce.com 不在以下 request 合法域名列表中,这是因为你在配置项目可用域名哪里没有把相关的https接口配置上。...
  • 主要介绍了PHP使用Face++接口开发微信公众平台人脸识别系统的方法,涉及微信公众平台相关接口的使用技巧,非常具有实用价值,需要的朋友可以参考下
  • 人脸识别是一款基于服务器平台的人脸比对识别服务程序,企业可将该识别服务部署在自有服务器上(云服务器或本地服务器),部署完成后,APP端、PC客户端、web端、微信H5端等均可发送识别请求,通过Web Service接口...
  • Android app接入微信人脸支付详解

    万次阅读 热门讨论 2019-01-12 17:33:44
    随着移动支付的多元化,越来越多的人喜欢使用刷脸支付,下面就微信人脸支付的流程进行分享。 在接入微信支付时,需要做两个准备操作,第一,在项目中导入由微信提供的aar文件,第二,在运行你自己的app环境中安装...
  • 微信小程序中实现人脸识别认证

    千次阅读 2021-01-03 21:56:29
    目前微信小程序人脸识别接口(微信开放社区对其定义为 “微信人脸核身接口能力”)只对特定的主体及类目的小程序开放,详见 微信人脸核身接口能力 笔者使用的微信小程序主体类目为医疗,因此能申请该权限。 2、步骤...
  • 涉及到的核心技术是微信小程序开发方法和百度云人脸识别接口。小程序的主体是一个用于个人密码存储的密码管理器,在登陆注册阶段,需要调用百度云人脸识别接口以及百度云在线人脸库的管理接口。本文主要涉及登陆注册...
  • 主要给大家分享的是一段人脸识别测颜值、测脸龄、测相似度微信接口的代码,非常的有意思,有需要的小伙伴可以参考下
  • 主要为大家详细介绍了微信小程序实现人脸识别,实现添加信息和上传照片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 涉及到的核心技术是微信小程序开发方法和百度云人脸识别接口。小程序的主体是一个用于个人密码存储的密码管理器,在登陆注册阶段,需要调用百度云人脸识别接口以及百度云在线人脸库的管理接口。本文主要涉及登陆注册...
  • 微信公众号实现人脸识别功能

    千次阅读 2020-04-03 14:47:07
    类似于某些app实现人脸识别登陆功能,在微信公众号实现人脸识别功能,该功能之适用于安卓手机,因为限于苹果手机权限管理严格无法调起苹果手机的摄像头,所以苹果手机只能通过微信jssdk的方式去调起摄像头拿到照片;...
  • 微信人脸SDK集成踩坑

    2021-09-11 09:40:36
    进行人脸识别 第三步调用凭证如果正常通过的话,客户端就会拿到文档上一些机密的参数,通过这些参数, 去拉起人脸识别,请注意,到这一步是识别,也就是说到这一步可以调起摄像头了, WxPayFace.getInstance()....
  • 人脸识别特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术。人脸识别是一项热门的计算机技术研究领域,可以将人脸明暗侦测,自动调整动态曝光补偿,人脸追踪侦测,自动调整影像放大;它属于生物特征识别...
  • 前几天偶然看见一个人脸识别的小程序demo,觉得很有趣下载下来想玩玩,结果只是一个框架而已用不了的,花了点时间完善一下 吐槽一下wx.uploadFile这个接口,真是个大坑,最开始调用时候,我以为它和同期的wx....
  • 微信小程序人脸识别

    千次阅读 2018-05-28 08:25:13
    微信小程序中的人脸识别登录大大提高了用户登录的安全性,所以人脸识别的技术应用的越来越广泛了。下面我们就来看看在微信小程序中人脸识别技术该怎么写。首先我们需要搭建一个前台的简单页面,示例代码如下:&lt...
  • 4、取上传返回的视频地址,调用后端提供的人脸识别接口,判断视频中是否含有人脸; 5、通过人脸识别后会返回一个图片地址,调用后端提供的实人认证接口 6、若这个过程中出现错误,则重新录制上传,本项目中失败三次...
  • 小帅一点资讯微信小程序图像识别源码,微信小程序百度AI接口源码,微信小程序图片上传显示缩放缩略图 人脸识别 植物、动物、菜品、车型等识别 换军装 人脸对比等功能
  • 首先我们先确认我们的百度云人脸库里已经上传了我们的个人信息照片 然后我们在后台写刷脸登陆的接口login我们要把拍照获取的照片存储到服务器 public function login(){ // 上传文件路径 $dir = "./Uploads/temp/...
  • 基于微信小程序的人脸识别

    千次阅读 2018-01-11 00:44:59
    现在关于人脸识别的SDK其实有很多,诸如face++、百度大脑之类的,他们都能为开发者免费提供人脸识别接口。阿里也和face++合作,实现了支付宝的刷脸支付。 但是很遗憾,网上关于识别一段视频中的用户行为(诸如...
  • 现在关于人脸识别的SDK其实有很多,诸如face++、百度大脑之类的,他们都能为开发者免费提供人脸识别接口。阿里也和face++合作,实现了支付宝的刷脸支付。 但是很遗憾,网上关于识别一段视频中的用户行为(诸如摇...
  • 刚好遇到要写微信小程序人脸识别的功能,就翻了一下微信小程序文档 人脸识别跳转文档 缺点:照片也可以成功。我试了一下眨眼,但是好像不行,闭眼都能识别到眼睛。 然后没有demo,就自己研究了,记录一下。用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,341
精华内容 1,736
关键字:

微信人脸识别接口