微信公众号支付

时间:2022-10-25 10:52:27

微信公众平台开发:通过全局Access Token获得用户基本信息的几种方式

https://www.cnblogs.com/kenshinobiy/p/5376297.html
     1 、通过全局Access Token获取用户基本信息 (用全局Access Token
     2、通过OAuth2.0方式弹出授权页面获得用户基本信息 (用授权Access Token
     3、通过OAuth2.0方式不弹出授权页面获得用户基本信息 (用全局Access Token
       特别要注意的是有两个不同的Access Token,他们产生的方式不一样,一种是使用AppID和AppSecret获取的access_token( 全局Access Token),一种是OAuth2.0授权中产生的access_token( 全局Access Token)。

         因为此处主要讲的是公众号支付,所以这里只介绍通过OAuth2.0方式 弹出授权页面或不弹出授权页面两种方式获取用户的基本信息,公众号支付的时候不需要到获取用户信息那一步,一般公众号支付只获取openId即可,特殊的需求特殊处理即可。下面介绍的是通过OAuth2.0授权的方式获取用户信息

通过OAuth2.0方式弹出授权页面(不弹出授权页面)获得用户基本信息(公众号支付的时候用于获取openID)

        ①首先设置回调域名
                          微信公众号支付

        【定义】授权回调页面域名:用户在网页授权页同意授权给公众号后,微信会将授权数据传给一个回调页面,回调页面需在此域名下,以确保安全可靠。

          此处只需要配置授权访问的域名就ok了,这里我配置的是http://paycentertest.emaxcard.com/emax-paycenter-web 

          注意:要保证域名可访问,并且要把MP_verify_****.txt放到站点相应的目录下(应用(webapp)的根目录下就可以),否则点击“确认”按钮会提示的。

     ②构造url 用来获取code
https://open.weixin.qq.com/connect/oauth2/authorize?
appid=wxd79d42656279ce9a&redirect_uri=http://paycentertest.emaxcard.com/emax-paycenter-web/pay/jsapi?tokenId=1559915356166726,33,11&
response_type=code&scope=snsapi_userinfo&state=state&connect_redirect=1#wechat_redirect

            scope=snsapi_userinfo 表示应用授权作用域为请求用户信息

            scope=snsapi_base 表示应用授权作用域为 不弹出授权页面,直接跳转,只获取用户openid

            ★ connect_redirect=1  如果没有有这个参数微信会重定向到return_url两回

            ★ 如果使用别人的AppID和AppSecret,那么获得的OpenID是那个有高级接口权限的服务号的,这里可以通过消息回复,获取本公众账号下的OpenID,带入回调中,与另一个OpenID进行关联也可以使用开放平台的UnionID功能来得到用户在自己账号下的OpenID 

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php?userid=oc7tbuPA9BgUCLADib5nB3k2KWWg&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

        如果scope=snsapi_base 则不会跳出下面授权页面

                  微信公众号支付

      ③ 回调页面得到链接如下,回调url中将包含参数code

http://paycentertest.emaxcard.com/emax-paycenter-web/pay/jsapi?tokenId=1559915356166726,33,11&code=0613yGze0xJELz1pFkye016Lze03yGzb&state=state

或者 
http://paycentertest.emaxcard.com/emax-paycenter-web/pay/jsapi?tokenId=1559915356166726,33,11&userid=oc7tbuPA9BgUCLADib5nB3k2KWWg&code=0613yGze0xJELz1pFkye016Lze03yGzb&state=state

      ④再使用code获取oauth2的授权access_token      url如下

https://api.weixin.qq.com/sns/oauth2/access_token?
appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code

     获得授权Access Token 和 openId: (公众号支付到此获得poenid即可,特殊需求再做特殊处理即可)

{
    "access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
    "expires_in": 7200,
    "refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "scope": "snsapi_userinfo,"
}

      ⑤再使用授权Access Token获取用户信息 url如下

https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc

           返回如下

{
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "nickname": "刺猬宝宝",
    "sex": 1,
    "language": "zh_CN",
    "city": "深圳",
    "province": "广东",
    "country": "中国",
    "headimgurl": "http://wx.qlogo.cn/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
    "privilege": []
}

获取code时两次重定向的问题

        当通过上述步骤②用来获取code的时候 会有微信两次 重定向到 return_url的情况,后来发现是构建获取code的url时其中一个参数在搞鬼,刚开始没有connect_redirect=1这个参数,后来加上就可以了就可以了

https://open.weixin.qq.com/connect/oauth2/authorize?
appid=wxd79d42656279ce9a&redirect_uri=http://paycentertest.emaxcard.com/emax-paycenter-web/pay/jsapi?tokenId=1559915356166726,33,11&
response_type=code&scope=snsapi_userinfo&state=state&connect_redirect=1#wechat_redirect


一、什么是OAuth2.0
官方网站:http://oauth.net/   http://oauth.net/2/
权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method from web,mobile and desktop applications. 
OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth 2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

新浪微博API目前也使用OAuth 2.0。


二、微信公众平台OAuth2.0授权
    微信公众平台OAuth2.0授权详细步骤如下:
        1. 用户关注微信公众账号。
        2. 微信公众账号提供用户请求授权页面URL。
        3. 用户点击授权页面URL,将向服务器发起请求
        4. 服务器询问用户是否同意授权给微信公众账号(scope为snsapi_base时无此步骤)
        5. 用户同意(scope为snsapi_base时无此步骤)
        6. 服务器将CODE通过回调传给微信公众账号
        7. 微信公众账号获得CODE
        8. 微信公众账号通过CODE向服务器请求Access Token
        9. 服务器返回Access Token和OpenID给微信公众账号
        10. 微信公众账号通过Access Token向服务器请求用户信息(scope为snsapi_base时无此步骤)
        11. 服务器将用户信息回送给微信公众账号(scope为snsapi_base时无此步骤)