一、 微信openid原理
微信openid由微信公众号提供,是微信公众号对于消费者微信产生的唯一用户身份标识。openid可以应用于云计算中的去中心化的身份认证技术,为用户以一个身份在多个云服务应用中通行提供了一种方式。
在聚合支付过程中,微信、支付宝在消费者使用手机支付的时,支付成功会返回给调用方openid(支付宝是buy_user_id)以标识消费者。结合微信的服务商模式,微信支付提供返回openid(对服务商),sub_openid(对渠道服务商)两个openid供业务方自定义使用,支付宝返回的buy_user_id是支付宝为消费者在支付宝系统中生成的唯一id,对所有通道、所有服务商都一样(本文不再描述)。
二、 支付过程中openid、sub_openid生成规则及使用
在云pos聚合支付(被扫)过程中,生成的openid,是消费者微信对支付服务商报备到微信的主体为支付服务商的公众号生成的。在微信支付的规则体系中,银行通道支付服务商只能是银行、三方通道(如中金)支付服务商只能是三方公司,因此,产生的openid,同一个消费者各个通道各不相同,同一通道是相同的。为了解决同一个消费者在多个通道支付时返回的openid一样的需求,微信提供了sub_openid的字段,供调用方自定义。对于实现本需求,可以在所有提供服务的银行、三方公司通道上,将烟草公司设置成渠道服务商,统一配置sub_appid为烟草公司公众号appid,这样微信就会返回该appid对应的openid放到sub_openid字段,这样就实现了同一个消费者在不同通道(不同店铺)支付时,产生的openid一样,就可以唯一识别一个消费者了。
三、 对于sub_openid的生成所需的实施工作
实现基于烟草公司公众号生成sub_openid,银行、三方公司在做商户入网时需在烟草公司渠道服务商下做商户入网,主要如下:
(1) 每一个银行、三方公司将地市烟草公司在微信支付上进件成渠道服务商。(提供营业执照、法人身份z、对公账户打款验证),设置sub_appid为烟草公司公众号appid
(2) 为商户在烟草公司渠道服务商下入网
(3) 确认支付时是否需要实时上送sub_appid,确定支付时接口调用规则。
登录微信公众平台后台获取公众号的AppId,设置回调地址。回调地址设置页面向导:开发>接口权限>网页服务>网页授权>修改。开发的项目需要放到已经解析好服务器域名的服务器下,同时把Mp***.text文件放到服务器根目录下,此时你的服务器必须能联通外网也就是有公网IP,并且80端口是打开的,可以使用阿里云等服务器,默认配置就可以了。openId是用户在当前公众号下的唯一标识(‘身份z’),就是说通过这个openId,就能区分在这个公众号下具体是哪个用户。
openId有什么用:假如用户A在当前公众号下购买了一件商品,用户的下单信息肯定要存储到后台数据库,那根据什么进行存储呢?openId是用户在当前公众号下的唯一标识,通过openId和用户的下单购买信息进行键值对的数据绑定。那么我要查询该用户购买过什么商品,就能够通过openId去查询,并且数据是唯一的,不会和另外的用户数据有冲突。
拓展:UnionID:一个商家或公司可能会有多个公众号,假如用户A同时都关注了这个公司下面的三个公众号,那么这个用户就会有三个openId(一个公众号就对应一个openID)。如果作为开发者的我们,要对这个用户在这三个公众号下消费的数据进行汇总,我怎么获取到这三份数据(同一用户的)?答案是UnionId,微信开发者文档:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。就是说如果要获取用户在同一公司不同公众号下的数据,后台表结构不但要关联openId,还要关联UnionId。
前几天和业务谈需求的时候提到了要在微信公众号里面做一个申请页面A。当时我对微信的了解还不是很多,只知道公众号上原来已经做了一个其他功能的页面B,B页面可以获取到客户微信的openid。
当时我们业务同事说只有B页面可以拿到openid,其他的页面都拿不到,所以这个正在谈的A页面入口要做在已有页面B上,然后通过B获取openid之后再传给A。我当时因为不懂也只能听他说,毕竟那个同事说的好像很确定的样子。
事后我仔细想了想,页面B也就是个普通的html呀,凭什么就B页面能获取客户的openid呢?肯定有方法的!于是我就上网搜了一下,最后成功获取了自己的openid,下面介绍下方法吧。
首先,你要有个微信公众号,并且要获得这个接口的权限
点修改之后,在功能设置的“网页授权域名”处添加可以获取微信openid的域名,也就是你自己公众号里面需要获取openid网页的域名。
做完上面这些之后,其实已经可以实现我们想要的效果了,这里因为我不是要做一个完整的功能,我只是想试验下html的页面怎么获取openid,所以过程比较简陋。
这里是微信官方的网页授权方法:
其实看起来微信的说明有那么一大段,但核心的内容也就那么一点点,总结下来就是:先拿到code,再用code去换取网页授权access_token。
因为重定向的url要urlEncode,所以这里我用另一个网站把我要访问的url转换了一下,网址如下:
在微信浏览器里面输入下面的url,appid、redirect_uri改成自己的,其他的都可以不用改。
静默授权:scope=snsapi_base
非静默授权:scope=snsapi_userinfo
一般在微信中是看不到url也没办法输入url的,所以这里我是用微信开发者工具调试的。
输入完静默授权的url后,url自动跳转成有code的,这个code只有5分钟有效期。
同样的,获取openid也就是在微信浏览器中执行一下下面这个url就可以了。appid,secret换成自己的,code用上面一步获取的,其他的都不用改。
运行完后的结果就显示在左边这个图里啦,你看,openid不就拿到了吗。
我没尝试非静默授权的,不过我想应该也差不多吧。这里也不是一套完整的方案告诉大家怎么把这个部署到前端和后端自动获取openid。我只是想分享一下我试验的经历。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)