微信开放平台_微信开放平台使用问题 - CSDN
精华内容
参与话题
  • 微信第三方开放平台实战

    千人学习 2018-10-22 21:38:05
    本课程包括微信开放平台介绍,使用背景,平台申请,系统划分,系统架构搭建,中控服务平台搭建开放,公众号扫码绑定开发,卡卷强授权介绍(解决未认证公众号怎么玩卡卷问题),全网发布流程等等
  • 1、OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 允许用户提供一个令牌,而...

    1、OAuth2.0

      OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

      允许用户提供一个令牌而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。
    2、目标
      我们这里主要模拟使用OAuth2.0,用户通过扫描我们网页应用的二维码并进行授权登录来获取用户的基本信息的过程。详细的接口相关信息可以在微信开放平台上查看:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
    3、前期准备(获取微信开发者权限)
      我们这里主要讲的是网站(Web)应用,网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统(即上面的协议)。在微信客户端授权登录(获取用户信息)的可以查看:http://www.cnblogs.com/0201zcr/p/5131602.html

      在进行微信OAuth2.在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

    3.1、注册开发者账号
      可以在https://open.weixin.qq.com/ 这里申请开发的账号。由于是腾讯的网页,这里可以直接通过 QQ号进行登录。
    3.2、提交网站应用审核
      在已经登录的界面中选择“管理中心”——》网站应用——》创建网站应用
       将会弹出下面的界面
      填写过后,还有有一个页面需要填写,提交一份纸质版申请书扫描件(会提供模板,我们下载再来填写后,需盖章,签名),配置回调域名(扫码登录后会跳转的页面)等。
      之后提交审核即可,等微信审核通过,我们即可获得我们需要的网页应用的appid和AppSecret,并配置后回调的域名了(这三样是我们开发所必须的)。
    3.3、开发者资质认证
      由于我们这里要使用微信登录的接口,所以我们还需要向微信提出认证,只有认证了才能使用微信那些高级的接口。未认证的如下图所示
       认证之后是这样子的:
        我现在暂时没有找到可以向公众账号那样子的测试账号的申请。如果有知道怎么可以申请到测试账号的高手,希望能赐教一下。
      接下来,我们就可以开始我们的网页微信扫码登录开发了。
    4、授权流程说明
      微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

      微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

    1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
    2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
    3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

       获取access_token时序图:

     
    5、获取网页的二维码
      当我们通过微信的认证,获取到了appid和AppSecret,并配置了回调的域名。我们就已经可以获取属于我们网页的二维码了,获取的方式很简单,只需打开一个微信的链接,加上我们的appid和回调域名即可在网页上面打开二维码,用户用微信客户端扫码并授权登录之后即会跳转到我们配置的回调域名下。
    注意:
    1、这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;
    2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.comhttp://qq.com无法进行OAuth2.0鉴权

    5.1、请求url说明

      第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接:

    https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

     

     参数说明
    参数是否必须说明
    appid应用唯一标识(前面认证网页应用中获得)
    redirect_uri重定向地址,需要进行UrlEncode(前面认证网页应用中获得)
    response_type填code
    scope应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
    state用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
     返回说明
       用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数
    redirect_uri?code=CODE&state=STATE

       若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数

    redirect_uri?state=STATE

    5.2、事例:

      一号店的微信二维码链接如下:

    https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect

       将其复制到浏览器中打开即可获得一号店的二维码,二维码页面如下:

      通过使用微信客户端的扫一扫功能,扫描该二维码,即会跳转到上面填写redirect_uri所在的地址上。假如用户同意授权,这里就获得了微信返回的code参数了。

    6、获取用户信息

      假如前面已经获得code。我们可以通过code参数去获取用户openid和access_token,进而获得用户的信息。
    6.1、通过code参数获取access_token
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

     参数说明

    参数是否必须说明
    appid应用唯一标识,在微信开放平台提交应用审核通过后获得
    secret应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
    code填写第一步获取的code参数
    grant_type填authorization_code
    返回说明

    正确的返回:

    复制代码
    { 
    "access_token":"ACCESS_TOKEN", 
    "expires_in":7200, 
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID", 
    "scope":"SCOPE",
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }
    复制代码
    参数说明
    access_token接口调用凭证
    expires_inaccess_token接口调用凭证超时时间,单位(秒)
    refresh_token用户刷新access_token
    openid授权用户唯一标识
    scope用户授权的作用域,使用逗号(,)分隔
     unionid当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。

    错误返回样例:

    {"errcode":40029,"errmsg":"invalid code"}
    注意
    • code参数的超时时间是5分钟,且每次请求的code参数的值都不一样。
    • access_token的超时时间是32分钟。
    6.2、通过access_token获取用户的基本信息
    获取的前提条件
    • access_token有效且为超时;
    • 微信用户已授权给第三方应用账号相应接口作用域(scope)【在二维码生成连接那里填写
    对于接口作用域(scope),能调用的接口有以下:
    授权作用域(scope)接口接口说明
    snsapi_base/sns/oauth2/access_token通过code换取access_token、refresh_token和已授权scope
    /sns/oauth2/refresh_token刷新或续期access_token使用
    /sns/auth检查access_token有效性
    snsapi_userinfo/sns/userinfo获取用户个人信息
     
      使用snsapi_base作用域的授权是扫码之后无需用户点击授权,扫码后直接跳转,用户感觉不到授权了,但这种授权方式能获取的数据量有限,这里我们要获取用户的基本信息,我们需要使用snsapi_userinfo授权。使用snsapi_userinfo授权,扫码后出现类似于下面的授权界面
      此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。请注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况。
      
    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

     参数说明

    参数是否必须说明
    access_token调用凭证(上一个请求中获得)
    openid普通用户的标识,对当前开发者帐号唯一(上一个请求中获得)
           lang  否国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN
    返回说明

    正确的Json返回结果:

    复制代码
    { 
    "openid":"OPENID",
    "nickname":"NICKNAME",
    "sex":1,
    "province":"PROVINCE",
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "privilege":[
    "PRIVILEGE1", 
    "PRIVILEGE2"
    ],
    "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
    
    }
    复制代码
    参数说明
    openid普通用户的标识,对当前开发者帐号唯一
    nickname普通用户昵称
    sex普通用户性别,1为男性,2为女性
    province普通用户个人资料填写的省份
    city普通用户个人资料填写的城市
    country国家,如中国为CN
    headimgurl用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
    privilege用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
    unionid用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

    错误的Json返回示例:

    { 
    "errcode":40003,"errmsg":"invalid openid"
    }

    7、总结 

      最近着手开发了微信网页扫码登录和公众号授权登录收获颇丰,两者的开发很类似。以下是我个人摸索过程中发现的两者的异同:

    • 两者都可以通过微信客户端扫码授权的方式,让第三方页面获得微信用户的一些基本信息(昵称、性别、所在地、在微信唯一标示等……)。他们都是通过提供一个链接让用户授权的方式。但网页版需要在页面打开二维码之后授权,而公众号则需要用户先关注了我们的公众号,然后点开公众号里面的链接,确认授权即可。
    • 网页扫码登录需要将授权的链接(二维码链接)在网页中打开、而公众号授权登录的链接必须要微信客户端中打开。
    • 无论网页扫码登录还是在公众号中授权登录,都是通过授权的方式获得一个code参数,之后通过code参数获取access_token和openid和通过access_token和openid去获取用户的基本信息的请求链接是一样的。
    • 在开发公众号授权登录的过程中,我发现了有测试账号的提供,足以满足我们的测试和开发,但在开发网页扫码时,暂时未发现哪里能获取测试账号,我是通过申请获取的。(希望知道哪里有测试账号的请求高手赐教)。

     公众账号授权登录:http://www.cnblogs.com/0201zcr/p/5131602.html

    微信公众号群发消息:http://www.cnblogs.com/0201zcr/p/5866296.html

       致谢:感谢您的阅读!
    展开全文
  • 微信开放平台“开发资源”中网站...据开发者资质认证处介绍:开发者资质认证通过后,微信开放平台帐号下的应用,将获得微信登录、智能接口、第三方平台开发等高级能力。 所以在微信第三方授权登陆获取用户信息...

    微信开放平台开发系列文章:

    微信开放平台开发第三方授权登陆(一):开发前期准备

    微信开放平台开发第三方授权登陆(二):PC网页端

    微信开放平台开发第三方授权登陆(三):Android客户端

    微信开放平台开发第三方授权登陆(四):微信公众号

    微信开放平台开发第三方授权登陆(五):微信小程序

     

    目录

    一、前期准备流程

    二、具体实现步骤

    1、注册邮箱账号

    2、注册微信开放平台账号、完善开发者资料

    3、申请开发者资质认证

    1)申请开发者资质认证

    2)选定类型

    3)填写“认证资料”

    4)填写“管理员信息”

    5)上传“企业基本信息”材料:

    6)进入填写发票及支付费用

    4、创建应用

    1)创建网站应用

    2)创建移动应用

    5、申请微信登陆功能

    三、注意事项

    四.主要提供材料

    五、特殊情况处理方案


    据微信开放平台“开发资源”中网站应用微信登陆功能开发指南描述:进行授权登陆接入前,需要先注册一个开发者账号,并拥有一个已经审核通过的网站应用,并获取AppID和APPSecret,然后申请微信登陆并通过审核后,可以接入流程进行开发。

    据开发者资质认证处介绍:开发者资质认证通过后,微信开放平台帐号下的应用,将获得微信登录、智能接口、第三方平台开发等高级能力。

    所以在微信第三方授权登陆获取用户信息开发前,需要做一些前期准备。目的是获取到AppID以及AppSecret,并成功申请微信登陆功能

    一、前期准备流程

    1、注册邮箱账号。

    2、根据邮箱账号注册微信开放平台账号,完善开发者资料。

    3、申请开发者资质认证、填写相关资料、填写发票、支付认证金额。提交并等待认证结果

    4、认证成功后,创建网站应用,填写基本信息、下载网站信息登记表填写并上传扫描件、填写授权回调域等。提交审核等待结果。

    5、认证成功后,创建移动应用,至少选择安卓、IOS、WP8其中一种平台

    6、创建应用成功后,申请微信登陆,等待审核结果,待审核通过后,可进行微信登陆的开发。

    注:创建应用和开发者资质认证可同时进行

    准备工作大致流程图

    二、具体实现步骤

    1、注册邮箱账号

    支持网易邮箱、QQ邮箱等常规邮箱。此邮箱将成为日后登陆开放平台的账号

     

    2、注册微信开放平台账号、完善开发者资料

    1)填写邮箱进行注册、开放平台将发送邮件到填写邮箱中,点击邮件上的地址进行开发者资料的完善。(开放平台注册地址:https://open.weixin.qq.com/cgi-bin/readtemplate?t=regist/regist_tmpl&lang=zh_CN

    2)开发者资料完善:主要填写注册人信息。如真实姓名、真实手机号码、联系地址、身份证号码。使用注册人的微信扫码绑定为管理员。提交信息。(邮件信息包含地址,点击后进行资料完善)

    3)完善资料后,根据邮箱及密码进行登录

     

    3、申请开发者资质认证

    1)申请开发者资质认证

    登录后,点击右上角邮箱号进入“基本资料”,点击“开发者资质认证”,显示未认证,点击“现在申请”。

    认证成功后,这里将变成认证成功:

    2)选定类型

    同意“微信开放平台开发者资质认证服务协议”,点击下一步。选择类型为“企业”,点击确定。

    注:类型包含了企业、网店商家、媒体(事业单位媒体、其他媒体)、政府及事业单位、其他组织(社会团体、民办非企业、其他组织)

    3)填写“认证资料”

    包括企业全称、组织机构代码、工商执照注册号、法定代表人/企业负责人姓名、经营范围(一般经营范围)、企业规模(选填)、企业开户名称、企业开户银行、企业银行账号。

    4)填写“管理员信息”

    包括账号管理员姓名、账号管理员部门与职位、账号管理员手机号、管理员座机、管理员电子邮件、身份证号。最后需要使用管理员的微信进行扫码。

    5)上传“企业基本信息”材料:

    需要准备的材料及要求如下

    I.组织机构代码证

    组织机构代码证必须在有效期范围内。必须是原件照片、扫描件或复印件加盖企业公章后的扫描件。图片不超2M

    II.企业工商营业执照

    中国大陆工商局或市场监督管理局颁发的工商营业执照,且必须在有效期内。要求原件照片、扫描件或者复印件加盖企业公章后的扫描件

    III.申请公函下载打印

    如果是一般企业需要先下载“一般企业申请认证公函”,个体下载“个体工商户申请认证公函”(见附件中“一般企业申请认证公函.doc”及“个体工商户申请认证公函.doc”或于网站中下载)。对下载的申请公函进行打印。

    IV.填写申请公函信息

    填写内容主要有(根据不同企业类型进行填写,只需要填写其中一个就可以):

    A.一般企业申请认证公函:

    a.企业信息:申请企业全称、官网(可缺省)、办公电话、办公地址、企业规模、企业简介(要说明企业经营范围,重要历程,主要产品和服务及覆盖区域等事项)、

    b.法定代表信息:法定代表人姓名、身份证号码、应用的Appid(这时还没有Appid,此项不填)、登陆Email、

    c.申请相关信息:申请认证理由、提供的服务、

    d.账号运营者信息 : 账号运营者姓名、部门及职位、身份证号、手机号、办公联系电话、电子邮箱

    e.填写认证申请公函:最后运营者签字并加盖企业章

    B.个体工商户申请认证公函:

    a.个体工商户信息:个体工商户全称、官网(可缺省)、办公电话、办公地址、规模、简介(主要说明经营范围,重要历程,主要产品和服务及覆盖区域等事项)

    b.经营者信息:经营者姓名、身份证号码、应用的Appid(这时还没有Appid,此项不填)、登陆Email

    c.申请相关信息:申请认证理由、提供的服务、

    d.账号运营者信息:账号运营者姓名、部门及职位、身份证号、手机号、办公联系电话、电子邮箱

    e.填写认证申请公函:最后运营者签字并加盖企业章

    V.对填写好的申请公函进行上传图片:

    上传加盖企业公章的原件照片或扫描件

    点击下一步。

    6)进入填写发票及支付费用

    等待认证结果。

    注:开发者认证费用为300.有效期一年,可在最后三个月申请年审续期

     

    4、创建应用

    1)创建网站应用

    进入开放平台首页(https://open.weixin.qq.com),点击上方“管理中心”,点击“网站应用”,点击“创建网站应用

    I.填写基本信息

    包括网站应用名称、英文名(选填)、应用简介、英文简介(选填)、应用官网。

    II.上传网站信息登记表扫描件及网站应用图片

           A. 网站信息登记表

    先下载《微信开放平台网站信息登记表》(见附件”微信开放平台网站信息登记表.doc”).然后进行填写打印。最后盖章,上传扫描件。图片不超过2M

    网站开放平台信息登记表填写内容包括:

    a. 网站信息:

    1)网站网址:要创建第三方准备使用的网址。

    2)网站备案号/许可证号

    3)主板单位名称/个人姓名

    4)单位/个人官网网址

    5)单位/个人所在地: 

    6)单位/个人简介:

    b. 开发者账户信息

    1)邮箱:注册微信开放平台的注册邮箱

    2)网站应用名称:与开放平台填写的网站应用名称一致

    c. 负责人信息

    1)  姓名

    2)  职务

    3)  联系人手机

    4)  责任人个人邮箱

    然后填写责任人签名。职务。以及填写日期,最后盖上申请公司的章

           B. 网站应用图片

    上传网站应用水印招聘。28*28像素以及108*108像素的png图片,大小不超过300k。

    上传完成后,点击下一步

    III.填写授权回调域

    填写合法的域名。第三方授权登陆后,只能回调到该域名下的页面。(即,开发的网站上线后的域名)

    审核时间大概7个工作日内(审核资料完整正确的话,大概3天左右能审核通过)

    审核不通过的话,会显示驳回,并且告知哪个环节审核不通过,可以重新修改再审,

    审核成功页面:

    2)创建移动应用

    进入开放平台首页(https://open.weixin.qq.com),点击上方“管理中心”,点击“移动应用”,点击“创建移动应用

    I.填写基本信息

    包括移动应用名称、英文名(选填)、应用简介、英文简介(选填)、应用官网。

    II.上传移动应用图片

        上传移动应用水印图片28*28像素的png图片,以及移动应用高清图片108*108像素的png图片。大小均不超过300k

    III.填写平台信息

         选择平台,一共有三种平台:ISO应用、Android应用和WP8应用

         至少选择一个平台,可以多选。

    A. IOS应用

           细分为iPhone和iPad,可多选

           这两种设备类型均需要提供“Bundle ID”(ISO应用唯一标识)、“测试版本Bundle ID”(ISO应用测试版本的BundleID)、“AppStore下载地址”(选填)

    B.Android应用

            需要提供 “应用签名” 和 “应用包名”,以及“应用下载地址(选填)”

         应用签名可以使用签名生成工具直接从安装当前应用的手机获取,应用签名由开发者签名该应用的keystore文件决定

         应用包名在manifest文件里声明,要和正式发布应用的包名一致。

    C.WP8 应用

            WP8应用只需要填写“应用下载地址(选填)”就可以了。

    注意:应用若还没有提交到应用市场,下载地址等可以暂时为空,提交到应用市场后,可修改下载地址。

     

    注:

    1.审核将在三个工作日内完成,目前只审核开发者的资质和真实性,不涉及应用内容本部,不需要开发者提交ipa文件或将含微信SDK的版本在AppStore上线后再审核,但要求开发者提供该应用已经上线的版本的下载地址

    2.同一应用在不同平台的版本应共用一个AppID

    审核成功后的页面(Android)

    5、申请微信登陆功能

    成功创建应用并审核通过后,点击应用右方“查看”可以查看应用详情。

    在“接口信息”一栏中,查看当前应用拥有的接口权限。

    选中“微信登陆”接口,点击右方申请开通,开通微信登陆功能。

     

    三、注意事项

    1、开发者资质认证结果只有成功或失败两种情况。审核费用与最终是否审核通过无关。每申请一次,就需要支付一次审核服务费用

    2、我方在完成在线申请及资料提交流程,并完成审核服务费用支付后,腾讯会在15个工作日内展开认证工作,我方应积极配合腾讯及第三方审核公司的认证需求,并有权随时了解、查询认证进度

    3.认证失败原因可能情况:

    1)由于我方原因,经腾讯三次系统通知用户调整申请内容,我方仍未能满足开发者资质认证要求的;

    2)由于我方原因:自用户付费之日起三十日,我方仍未能满足开发者资质认证要求之一;

    3)因其他原因而不能认证成功的情形

    4、网站应用和移动应用一个开发者最多只能登记10个。

     

    四.主要提供材料

    主要提供材料,详情见“具体实现步骤

    1. 微信开放平台登陆邮箱
    2. 开发者个人详细信息
    3. 企业信息及法人(负责人)信息(包括官网等)
    4. 企业账号管理员信息(包括微信扫码)
    5. 企业章
    6. 应用官网及备案号/许可证。 应用图标。

     

    五、特殊情况处理方案

    1.若我方向腾讯或者第三方审核机构提供的资料和信息如有变更的,应当及时采取以下措施:

    1)如处于认证过程中的资料和信息发生变更,用户应立即通知腾讯或负责认证订单的第三方审核机构更新有关资料及信息;

    2)如认证成功后资料和信息发生变更,用户应及时申请补充订单变更有关资料及信息;

    3)如认证成功后腾讯发现资料和信息存在错误,用户应及时申请补充订单更正有关资料及信息。

    展开全文
  • 注册微信开放平台账号 到该网站注册账号–>>微信·开放平台 注册的邮箱一定不能跟微信绑定,如果绑定就换个邮箱就好了 创建你的应用在开发平台 在管理中心创建你的移动应用,到应用签名使用android...

    注册微信开放平台账号

    到该网站注册账号–>>微信·开放平台
    注册的邮箱一定不能跟微信绑定,如果绑定就换个邮箱就好了

    创建你的应用在开发平台

    在管理中心创建你的移动应用,到应用签名使用android资源下载中的签名工具获取就好了。
    可以参考android集成微信分享

    开发流程

    public class MainActivity extends AppCompatActivity {

    private TextView mResultTv;
    private Button mRegBtn;
    private Button mGotoSendBtn;
    private Button mLaunchWxBtn;
    private Button mCheckTimelineSupportedBtn;
    
    /**
     * 微信程序中的ID
     */
    private static final String APP_ID = "";
    public static IWXAPI mIWXAPI;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        regToWx();
        assignViews();
        initEvent();
    }
    
    private void initEvent() {
    

    // 注册
    mRegBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

            }
        });
    

    // 调准到发送消息
    mGotoSendBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    //向好友或朋友圈发送文本
    sendTextStr(“我发送了一个分享。。。”, System.currentTimeMillis() + “”);
    }
    });
    // 启动微信
    mLaunchWxBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(MainActivity.this, “是否安装微信–>>” + mIWXAPI.isWXAppInstalled(), Toast.LENGTH_SHORT).show();
    Toast.makeText(MainActivity.this, “是否打开微信–>>” + mIWXAPI.openWXApp(), Toast.LENGTH_SHORT).show();
    }
    });
    // 检查是否支持朋友群
    mCheckTimelineSupportedBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(MainActivity.this, “是否支持朋友圈–>>” + mIWXAPI.isWXAppSupportAPI(), Toast.LENGTH_SHORT).show();
    Toast.makeText(MainActivity.this, “是否支持朋友圈111–>>” + mIWXAPI.getWXAppSupportAPI(), Toast.LENGTH_SHORT).show();
    //Build.PAY_SUPPORTED_SDK_INT大于于mIWXAPI.getWXAppSupportAPI()就表示不支持微信支付
    }
    });
    }

    /**
     * 向好友或朋友圈发送文本
     *
     * @param sendStr     发送的信息
     * @param transaction 跟微信交互对象的唯一标示
     */
    private void sendTextStr(String sendStr, String transaction) {
        //1.初始化创建分享文本对象
        WXTextObject wxTextObject = new WXTextObject();
        wxTextObject.text = sendStr;
    
        //2.创建传输对象 用于android向微信发送数据
        WXMediaMessage wxMediaMessage = new WXMediaMessage();
        wxMediaMessage.mediaObject = wxTextObject;
        //设置一个描述
        wxMediaMessage.description = "我是分享描述";
    
        //3.创建跟微信交互的对象
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.message = wxMediaMessage;
        //唯一标示
        req.transaction = transaction;
        //场景-->>表示发送给朋友(SendMessageToWX.Req.WXSceneSession)
        //             还是朋友圈(SendMessageToWX.Req.WXSceneTimeline)
        req.scene = SendMessageToWX.Req.WXSceneTimeline;
    
        //4.发送给微信客户端 发送成功返回true 失败返回false
        boolean sendReq = mIWXAPI.sendReq(req);
        Toast.makeText(this, "发送微信客户端是否成功:" + sendReq, Toast.LENGTH_SHORT).show();
    }
    
    private void assignViews() {
        mResultTv = (TextView) findViewById(R.id.result_tv);
        mRegBtn = (Button) findViewById(R.id.reg_btn);
        mGotoSendBtn = (Button) findViewById(R.id.goto_send_btn);
        mLaunchWxBtn = (Button) findViewById(R.id.launch_wx_btn);
        mCheckTimelineSupportedBtn = (Button) findViewById(R.id.check_timeline_supported_btn);
    }
    
    private void regToWx() {
        mIWXAPI = WXAPIFactory.createWXAPI(this, APP_ID, true);
        mIWXAPI.registerApp(APP_ID);
    }
    

    }


    在注册的包名下面创建一个叫”wxapi”的包
    package com.zhouyijin.zyj.fakeshanbay.wxapi;
    创建指定名字的Activity
    创建一个Acitivty,必须是这个名字!
    public class WXEntryActivity extends AppCompatActivity {}

    /**

    • 类描述://TODO:(这里用一句话描述这个方法的作用)

    • 创建人:吧啦吧啦

    • 创建时间:2018/4/11 16:45

      */
      public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.entry);

       //如果分享的时候,该界面没有开启,那么微信开始这个activity时,会调用onCreate,所以这里要处理微信的返回结果
       MainActivity.mIWXAPI.handleIntent(getIntent(), this);
      

      }

      @Override
      protected void onNewIntent(Intent intent) {
      super.onNewIntent(intent);

       //如果分享的时候,该已经开启,那么微信开始这个activity时,会调用onNewIntent,所以这里要处理微信的返回结果
       setIntent(intent);
       MainActivity.mIWXAPI.handleIntent(getIntent(), this);
      

      }

      @Override
      public void onResp(BaseResp resp) { //在这个方法中处理微信传回的数据
      Toast.makeText(this, “errCode->”+resp.errCode, Toast.LENGTH_SHORT).show();
      //形参resp 有下面两个个属性比较重要
      //1.resp.errCode
      //2.resp.transaction则是在分享数据的时候手动指定的字符创,用来分辨是那次分享(参照4.中req.transaction)
      switch (resp.errCode) { //根据需要的情况进行处理
      case BaseResp.ErrCode.ERR_OK:
      //正确返回
      Toast.makeText(this, “正确返回”, Toast.LENGTH_SHORT).show();
      break;
      case BaseResp.ErrCode.ERR_USER_CANCEL:
      //用户取消
      Toast.makeText(this, “用户取消”, Toast.LENGTH_SHORT).show();
      break;
      case BaseResp.ErrCode.ERR_AUTH_DENIED:
      //认证被否决
      Toast.makeText(this, “认证被否决”, Toast.LENGTH_SHORT).show();
      break;
      case BaseResp.ErrCode.ERR_SENT_FAILED:
      //发送失败
      Toast.makeText(this, “发送失败”, Toast.LENGTH_SHORT).show();
      break;
      case BaseResp.ErrCode.ERR_UNSUPPORT:
      //不支持错误
      Toast.makeText(this, “不支持错误”, Toast.LENGTH_SHORT).show();
      break;
      case BaseResp.ErrCode.ERR_COMM:
      //一般错误
      Toast.makeText(this, “一般错误”, Toast.LENGTH_SHORT).show();
      break;
      default:
      //其他不可名状的情况
      Toast.makeText(this, “其他不可名状的情况->”+resp.errCode, Toast.LENGTH_SHORT).show();
      break;
      }
      }

      @Override
      public void onReq(BaseReq req) {
      //…这里是用来处理接收的请求,暂不做讨论
      }

    }

    展开全文
  • 1 微信开放平台:https://open.weixin.qq.com/ 2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&...

    1 微信开放平台:https://open.weixin.qq.com/

    2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

    3.pc页面显示

    4. 通过官方提供的文档,我们可以看出一共分4个步骤

    第一步:请求CODE
    第二步:通过code获取access_token
    第三步:通过access_token调用接口
    第4步:获取用户个人信息(UnionID机制)

     

     5.源码下载地址:http://pan.baidu.com/s/1pLyG66J

    因代码加密:现贴出代码如下(下载后替换):

    Controllers--》DefaultController.cs

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Configuration;
      4 using System.Text;
      5 using System.Web;
      6 using System.Web.Mvc;
      7 
      8 using WebWeChat.Models;
      9 
     10 namespace WebWeChat.Controllers
     11 {
     12     public class DefaultController : Controller
     13     {
     14         #region 微信登录
     15 
     16         /// <summary>
     17         /// 微信登录
     18         /// </summary>
     19         public ActionResult WeChat()
     20         {
     21             //获得配置信息
     22             string oauthAppId = ConfigurationManager.AppSettings["oauth_app_id"];
     23             string redirectUri = ConfigurationManager.AppSettings["Redirect_uri"];
     24             if (oauthAppId == null)
     25             {
     26                 return this.Content("出错了,您尚未配置微信相关的API信息!");
     27             }
     28             string state = Guid.NewGuid().ToString().Replace("-", "");
     29             this.Session["oauth_state"] = state;
     30             string sendUrl =
     31                 "https://open.weixin.qq.com/connect/qrconnect?appid=" + oauthAppId +
     32                 "&redirect_uri=" + HttpUtility.UrlEncode(redirectUri.ToLower()) +
     33                 "&response_type=code&scope=snsapi_login&state=" + state +
     34                 "#wechat_redirect";
     35 
     36             //开始发送
     37             return this.Redirect(sendUrl); //跳转到微信自己 指定的关联登陆页面
     38         }
     39 
     40         /// <summary>
     41         /// 微信登录返回action
     42         /// </summary>
     43         public ActionResult WeChatReturnUrl(string state, string code)
     44         {
     45             //取得返回参数
     46 
     47             if (this.Session["oauth_state"] == null || this.Session["oauth_state"].ToString() == "" ||
     48                 state != this.Session["oauth_state"].ToString() || string.IsNullOrEmpty(code)) //若返回参数中未包含code或者state没有通过验证则提示出错
     49             {
     50                 return this.Content("出错啦,state未初始化!");
     51             }
     52 
     53             //第一步:通过code来获取Access Token以及openid
     54             Dictionary<string, object> dic1 = WeixinHelper.get_access_token(code, state);
     55             if (dic1 == null || !dic1.ContainsKey("access_token"))
     56             {
     57                 return this.Content("错误代码:,无法获取Access Token,请检查App Key是否正确!");
     58             }
     59             if (!dic1.ContainsKey("openid"))
     60             {
     61                 return dic1.ContainsKey("errmsg")
     62                     ? this.Content("errcode:" + dic1["errcode"] + ",errmsg:" + dic1["errmsg"])
     63                     : this.Content("出错啦,无法获取用户授权Openid!");
     64             }
     65 
     66             var accessToken = dic1["access_token"].ToString();
     67             var refreshToken = dic1["refresh_token"].ToString();
     68             var openid = dic1["openid"].ToString();
     69 
     70             //储存获取数据用到的信息
     71             this.Session["oauth_name"] = "webchat";
     72             this.Session["oauth_access_token"] = accessToken;
     73             this.Session["oauth_openid"] = openid;
     74             this.Session["oauth_refresh_token"] = refreshToken;
     75 
     76             #region todo 将获取到的用户信息保存到数据库中
     77 
     78             #endregion
     79 
     80             //第二步:通过Access Token以及openid来获取用户的基本信息
     81             //Dictionary<string, object> dic2 = weixin_helper.get_user_info(access_token,openid);
     82 
     83             //第三步:跳转到指定页面
     84             return this.Content(this.WeChatResultJson());
     85         }
     86 
     87         /// <summary>
     88         /// 微信登录返回action, 处理用户信息
     89         /// </summary>
     90         public string WeChatResultJson()
     91         {
     92             if (this.Session["oauth_name"] == null || this.Session["oauth_access_token"] == null ||
     93                 this.Session["oauth_openid"] == null)
     94             {
     95                 return "{\"ret\":\"1\", \"msg\":\"出错啦,Access Token已过期或不存在!\"}";
     96             }
     97             var oauthName = this.Session["oauth_name"].ToString();
     98             var oauthAccessToken = this.Session["oauth_access_token"].ToString();
     99             var oauthOpenid = this.Session["oauth_openid"].ToString();
    100             var oauthRefreshToken = this.Session["oauth_refresh_token"].ToString();
    101 
    102             if (!WeixinHelper.check_access_token(oauthAccessToken)) //调用access_token前需判断是否过期
    103             {
    104                 Dictionary<string, object> dic1 = WeixinHelper.get_refresh_token(oauthRefreshToken); //如果已过期则重新换取新的access_token
    105                 if (dic1 == null || !dic1.ContainsKey("access_token"))
    106                 {
    107                     return "{\"openid\":\"0\", \"msg\":\"出错啦,无法获取access_token!\"}";
    108                 }
    109                 oauthAccessToken = dic1["access_token"].ToString();
    110             }
    111 
    112             Dictionary<string, object> dic = WeixinHelper.get_user_info(oauthAccessToken, oauthOpenid);
    113             if (dic == null)
    114             {
    115                 return "{\"openid\":\"0\", \"msg\":\"出错啦,无法获取授权用户信息!\"}";
    116             }
    117             try
    118             {
    119                 StringBuilder str = new StringBuilder();
    120                 str.Append("{");
    121                 str.Append("\"openid\": \"" + dic["openid"] + "\", ");
    122                 str.Append("\"nickname\": \"" + dic["nickname"] + "\", ");
    123                 str.Append("\"sex\": \"" + dic["sex"] + "\", ");
    124                 str.Append("\"province\": \"" + dic["province"] + "\", ");
    125                 str.Append("\"city\": \"" + dic["city"] + "\", ");
    126                 str.Append("\"country\": \"" + dic["country"] + "\", ");
    127                 str.Append("\"headimgurl\": \"" + dic["headimgurl"] + "\", ");
    128                 str.Append("\"privilege\": \"" + dic["privilege"] + "\", ");
    129                 str.Append("\"unionid\": \"" + dic["unionid"] + "\"");
    130                 str.Append("\"oauth_name\": \"" + oauthName + "\"");
    131                 str.Append("\"oauth_access_token\": \"" + oauthAccessToken + "\"");
    132                 str.Append("\"oauth_openid\": \"" + oauthOpenid + "\"");
    133                 str.Append("}");
    134                 return str.ToString();
    135             }
    136             catch
    137             {
    138                 return "{\"ret\":\"0\", \"msg\":\"出错啦,无法获取授权用户信息!\"}";
    139             }
    140         }
    141 
    142         #endregion
    143     }
    144 }

    Models---》HttpMethods

      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Net;
      5 using System.Text;
      6 
      7 namespace WebWeChat.Models
      8 {
      9     ////
     10     /// <summary>   A HTTP methods. </summary>
     11     ///
     12     /// <remarks>   xiaop, 2014/12/16. </remarks>
     13     ////
     14     public static class HttpMethods
     15     {
     16         #region POST
     17 
     18         /// <summary>
     19         /// HTTP POST方式请求数据
     20         /// </summary>
     21         /// <param name="url">URL.</param>
     22         /// <param name="param">POST的数据</param>
     23         /// <returns></returns>
     24         public static string HttpPost(string url, string param)
     25         {
     26             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     27             request.Method = "POST";
     28             request.ContentType = "application/x-www-form-urlencoded";
     29             request.Accept = "*/*";
     30             request.Timeout = 15000;
     31             request.AllowAutoRedirect = false;
     32 
     33             string responseStr;
     34 
     35             var requestStream = new StreamWriter(request.GetRequestStream());
     36             requestStream.Write(param);
     37             requestStream.Close();
     38 
     39             var response = request.GetResponse();
     40             {
     41                 // ReSharper disable once AssignNullToNotNullAttribute
     42                 StreamReader reader = new StreamReader(stream: response.GetResponseStream(), encoding: Encoding.UTF8);
     43                 responseStr = reader.ReadToEnd();
     44                 reader.Close();
     45             }
     46 
     47             return responseStr;
     48         }
     49 
     50         #endregion
     51 
     52         #region Get
     53 
     54         /// <summary>
     55         /// HTTP GET方式请求数据.
     56         /// </summary>
     57         /// <param name="url">URL.</param>
     58         /// <returns></returns>
     59         public static string HttpGet(string url)
     60         {
     61             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     62             request.Method = "GET";
     63 
     64             //request.ContentType = "application/x-www-form-urlencoded";
     65             request.Accept = "*/*";
     66             request.Timeout = 15000;
     67             request.AllowAutoRedirect = false;
     68 
     69             string responseStr;
     70 
     71             var response = request.GetResponse();
     72 
     73             {
     74                 // ReSharper disable once AssignNullToNotNullAttribute
     75                 StreamReader reader = new StreamReader(stream: response.GetResponseStream(), encoding: Encoding.UTF8);
     76                 responseStr = reader.ReadToEnd();
     77                 reader.Close();
     78             }
     79 
     80             return responseStr;
     81         }
     82 
     83         #endregion
     84 
     85         #region Post With Pic
     86 
     87         public static string HttpPost(string url, IDictionary<object, object> param, string filePath)
     88         {
     89             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
     90             byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
     91 
     92             HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
     93             wr.ContentType = "multipart/form-data; boundary=" + boundary;
     94             wr.Method = "POST";
     95             wr.KeepAlive = true;
     96             wr.Credentials = CredentialCache.DefaultCredentials;
     97 
     98             Stream rs = wr.GetRequestStream();
     99             string responseStr = null;
    100 
    101             string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
    102             foreach (string key in param.Keys)
    103             {
    104                 rs.Write(boundarybytes, 0, boundarybytes.Length);
    105                 string formitem = string.Format(formdataTemplate, key, param[key]);
    106                 byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    107                 rs.Write(formitembytes, 0, formitembytes.Length);
    108             }
    109             rs.Write(boundarybytes, 0, boundarybytes.Length);
    110 
    111             string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
    112             string header = string.Format(headerTemplate, "pic", filePath, "text/plain");
    113             byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    114             rs.Write(headerbytes, 0, headerbytes.Length);
    115 
    116             FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    117             byte[] buffer = new byte[4096];
    118             int bytesRead;
    119             while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
    120             {
    121                 rs.Write(buffer, 0, bytesRead);
    122             }
    123             fileStream.Close();
    124 
    125             byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    126             rs.Write(trailer, 0, trailer.Length);
    127             rs.Close();
    128 
    129             WebResponse wresp = null;
    130             try
    131             {
    132                 wresp = wr.GetResponse();
    133                 Stream stream2 = wresp.GetResponseStream();
    134                 if (stream2 != null)
    135                 {
    136                     StreamReader reader2 = new StreamReader(stream2);
    137                     responseStr = reader2.ReadToEnd();
    138                 }
    139 
    140                 //logger.Debug(string.Format("File uploaded, server response is: {0}", responseStr));
    141             }
    142             catch (Exception)
    143             {
    144                 //logger.Error("Error uploading file", ex);
    145                 if (wresp != null)
    146                 {
    147                     wresp.Close();
    148                 }
    149             }
    150             return responseStr;
    151         }
    152 
    153         #endregion
    154 
    155         #region Post With Pic
    156 
    157         /// <summary>
    158         /// HTTP POST方式请求数据(带图片)
    159         /// </summary>
    160         /// <param name="url">URL</param>        
    161         /// <param name="param">POST的数据</param>
    162         /// <param name="fileByte">图片</param>
    163         /// <returns></returns>
    164         public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte)
    165         {
    166             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
    167             byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
    168 
    169             HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
    170             wr.ContentType = "multipart/form-data; boundary=" + boundary;
    171             wr.Method = "POST";
    172             wr.KeepAlive = true;
    173             wr.Credentials = CredentialCache.DefaultCredentials;
    174 
    175             Stream rs = wr.GetRequestStream();
    176             string responseStr = null;
    177 
    178             string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
    179             foreach (string key in param.Keys)
    180             {
    181                 rs.Write(boundarybytes, 0, boundarybytes.Length);
    182                 string formitem = string.Format(formdataTemplate, key, param[key]);
    183                 byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    184                 rs.Write(formitembytes, 0, formitembytes.Length);
    185             }
    186             rs.Write(boundarybytes, 0, boundarybytes.Length);
    187 
    188             string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
    189             string header = string.Format(headerTemplate, "pic", fileByte, "text/plain"); //image/jpeg
    190             byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    191             rs.Write(headerbytes, 0, headerbytes.Length);
    192 
    193             rs.Write(fileByte, 0, fileByte.Length);
    194 
    195             byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    196             rs.Write(trailer, 0, trailer.Length);
    197             rs.Close();
    198 
    199             WebResponse wresp = null;
    200             try
    201             {
    202                 wresp = wr.GetResponse();
    203                 Stream stream2 = wresp.GetResponseStream();
    204                 if (stream2 != null)
    205                 {
    206                     StreamReader reader2 = new StreamReader(stream2);
    207                     responseStr = reader2.ReadToEnd();
    208                 }
    209 
    210                 // logger.Error(string.Format("File uploaded, server response is: {0}", responseStr));
    211             }
    212             catch (Exception)
    213             {
    214                 //logger.Error("Error uploading file", ex);
    215                 if (wresp != null)
    216                 {
    217                     wresp.Close();
    218                 }
    219             }
    220             return responseStr;
    221         }
    222 
    223         #endregion
    224     }
    225 }

    Models---》WeixinHelper

      1 using System.Collections.Generic;
      2 using System.Configuration;
      3 
      4 using Newtonsoft.Json;
      5 
      6 namespace WebWeChat.Models
      7 {
      8     public static class WeixinHelper
      9     {
     10         #region 获得配置信息
     11 
     12         private static readonly string OauthAppId = ConfigurationManager.AppSettings["oauth_app_id"];
     13         private static readonly string OauthAppKey = ConfigurationManager.AppSettings["oauth_app_key"];
     14 
     15         #endregion
     16 
     17         /// <summary>
     18         /// 根据AppID和AppSecret获得access token(默认过期时间为2小时)
     19         /// </summary>
     20         /// <returns>Dictionary</returns>
     21         public static Dictionary<string, object> get_access_token()
     22         {
     23             string sendUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +
     24                              WeixinHelper.OauthAppId + "&secret=" + WeixinHelper.OauthAppKey + "";
     25 
     26             //发送并接受返回值
     27             string result = HttpMethods.HttpGet(sendUrl);
     28             if (result.Contains("errmsg"))
     29             {
     30                 return null;
     31             }
     32             try
     33             {
     34                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     35                 return dic;
     36             }
     37             catch
     38             {
     39                 return null;
     40             }
     41         }
     42 
     43         /// <summary>
     44         /// 取得临时的Access Token(默认过期时间为2小时)
     45         /// </summary>
     46         /// <param name="code">临时Authorization Code</param>
     47         /// <param name="state">防止CSRF攻击,成功授权后回调时会原样带回</param>
     48         /// <returns>Dictionary</returns>
     49         public static Dictionary<string, object> get_access_token(string code, string state)
     50         {
     51             string sendUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +
     52                              WeixinHelper.OauthAppId + "&secret=" + WeixinHelper.OauthAppKey + "&code=" + code +
     53                              "&grant_type=authorization_code";
     54 
     55             //发送并接受返回值
     56             string result = HttpMethods.HttpGet(sendUrl);
     57             if (result.Contains("errmsg"))
     58             {
     59                 return null;
     60             }
     61             try
     62             {
     63                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     64                 return dic;
     65             }
     66             catch
     67             {
     68                 return null;
     69             }
     70         }
     71 
     72         /// <summary>
     73         /// 根据access_token判断access_token是否过期
     74         /// </summary>
     75         /// <param name="accessToken"></param>
     76         /// <returns>true表示未失效</returns>
     77         public static bool check_access_token(string accessToken)
     78         {
     79             string sendUrl = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + WeixinHelper.OauthAppId;
     80 
     81             //发送并接受返回值
     82             string result = HttpMethods.HttpGet(sendUrl);
     83             try
     84             {
     85                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     86                 if (dic.ContainsKey("errmsg"))
     87                 {
     88                     return dic["errmsg"].ToString() == "ok";
     89                 }
     90                 return false;
     91             }
     92             catch
     93             {
     94                 return false;
     95             }
     96         }
     97 
     98         /// <summary>
     99         /// 若fresh_token已过期则根据refresh_token取得新的refresh_token
    100         /// </summary>
    101         /// <param name="refreshToken">refresh_token</param>
    102         /// <returns>Dictionary</returns>
    103         public static Dictionary<string, object> get_refresh_token(string refreshToken)
    104         {
    105             string sendUrl =
    106                 "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" +
    107                 WeixinHelper.OauthAppId + "&grant_type=refresh_token&refresh_token=" + refreshToken;
    108 
    109             //发送并接受返回值
    110             string result = HttpMethods.HttpGet(sendUrl);
    111             if (result.Contains("errmsg"))
    112             {
    113                 return null;
    114             }
    115             try
    116             {
    117                 return JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
    118             }
    119             catch
    120             {
    121                 return null;
    122             }
    123         }
    124 
    125         /// <summary>
    126         /// 获取登录用户自己的基本资料
    127         /// </summary>
    128         /// <param name="accessToken">临时的Access Token</param>
    129         /// <param name="openId">用户openid</param>
    130         /// <returns>Dictionary</returns>
    131         public static Dictionary<string, object> get_user_info(string accessToken, string openId)
    132         {
    133             //发送并接受返回值   
    134             string sendUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
    135 
    136             //发送并接受返回值
    137             string result = HttpMethods.HttpGet(sendUrl);
    138             if (result.Contains("errmsg"))
    139             {
    140                 return null;
    141             }
    142 
    143             //反序列化JSON
    144             Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
    145             return dic;
    146         }
    147     }
    148 }

     

    我的签名:坚持赚钱,顺便理想

    转载于:https://www.cnblogs.com/xxpeng/p/4832051.html

    展开全文
  • 微信开放平台 和 微信公众平台 概念不同。   1、首先需要注册微信开放平台,然后获取开发者认证。审批通过之后再创建一个移动应用同样还是需要审批。通过之后就可以给这个应用添加微信授权登陆以及相应功能了...
  • http://www.cnblogs.com/linjunjie/p/6249989.html 微信开放平台 和 微信公众平台 概念不同。 第一步:获取AppID AppSecret(不做解释,自己去微信公众平台申请)   第二步:生成扫描二维码,获取code ...
  • 微信第三方开放平台研发实战

    万次阅读 2019-07-05 10:16:32
    微信开放平台之第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台,让其帮助完成业务开发,且是基于微信 CRM 的必要组成模块之一。 对于刚开始接触第三方平台开发的人员来说...
  • 什么是微信公众平台、微信开放平台?它们之间又有什么区别?下面为大家详细介绍下!   开放平台是网站或app使用的接口平台,利用开放平台可在自己的网站或app上开发微信帐户登录、微信分享等功能! 公众平台是...
  • 微信公众平台、微信开放平台的关系背景简介微信公众平台能干什么?微信开放平台(open平台)能干什么? 背景 做微信相关开发的时候,要登录很多账号,而且不同的功能要在这两个账号之间切换来切换去,很烦;所以今天...
  • 微信开放平台上创建移动应用

    千次阅读 2018-06-17 08:44:44
    本人因为想测试下微信第三方登陆和微信支付等功能,在微信开放平台上创建了一个移动应用(随便起了个名“呵什么呵”),但是由于暂时没有官网,填了www.baidu.com,作为官网,等了几天后发现审核未通过。我意识到可能...
  • 申请微信开放平台的主要目的:实现APP或者网站的微信登录。 所以要实现APP或者网站的微信登录,必须通过微信开放平台开发者资质认证(一年需要交纳300元)才能获得接口权限。 现在很多企业都已经实现了三证...
  • 最近在申请微信支付接口的时候遇到的坑爹问题,微信开放平台上也没什么说明,找了半天也没找到任何相关的文档,当然我创建的是IOS应用,所以可能这块资料比较少…… 回到正题,解决在微信开放平台创建IOS应用时应用...
  • 微信开放平台绑定各移动应用、网站应用、公众号、小程序、第三方的个数 目前没有在微信的文档中找到过具体的数字,只能真正的登录到后台,并且已经认证了的才能看的到。认证需要300元/年。 很多人都不知道具体的...
  • 如果你发现你其他操作没错,签名和微信开放平台的也一致,但是却报了微信应用签名与开放平台不一致的错误。 !!! 那你就要注意了:微信使用的应用签名必须是MD5,不能使用SHA1 ...
  • 微信开放平台 主要面对移动应用/网站应用开发者,为其提供微信登录、分享、支付等相关权限和服务。 微信开放平台还提供了数据统计功能,用于开发者统计接入应用的登录、分享等数据情况。 接入步骤 已京东APP举例...
  • 背景:应用或多或少会接入微信分享的功能。但是由于某些原因,自己配置的应用信息与开放平台的信息一致,但还是会报错: “包名不对,请检查包名是否与开放...微信:签名不对,请检查签名是否与开放平台填写的一致...
  • 一、如何开通微信公众号、微信开发平台、授权认证、接口权限申请等等,这些不在本文描述,请参考官方资料。 二、假设已顺利完成第一步的工作,现在需要在自己开发的网站(PC端、移动端,注意两者略有不同,下文有...
  • android之微信开放平台修改签名

    千次阅读 2017-10-12 16:21:01
    本人在接入微信sdk时遇见了好多坑,借此给大家提个醒,能帮助到的点个赞,帮不到的可以参考一下。1.返回码为 -6 ——————-造成这个的原因是你的签名和你的打包密钥不一致,还有就是你的AppId和你的包名。2....
  • ![图片说明](https://img-ask.csdn.net/upload/201608/18/1471517253_629488.png) 就这一行应该填什么,求大神!!
1 2 3 4 5 ... 20
收藏数 74,562
精华内容 29,824
关键字:

微信开放平台