이 글은 안드로이드 위챗 인증 로그인 개발과 위챗 공유 분석에 대한 자세한 그래픽과 텍스트 설명을 중심으로 소개하고 있으니 필요하신 분들은 참고하시면 좋을 것 같습니다.
서문
모바일 인터넷의 물결 속에서 인터넷에 연결된 APP는 해변의 단일 시스템 장치를 죽였습니다. 많은 회사는 애플리케이션에 계정 시스템이 있기를 희망하지만 많은 사용자는 그렇게 합니다. : 꼭 구매하지 않아도 됩니다. : 애플리케이션에 계정을 등록해야 하는 이유는 무엇입니까? Weibo, WeChat 및 QQ는 거의 모든 사람의 휴대폰에 필수 설치 애플리케이션이 되었기 때문에 WeChat, Weibo 및 QQ는 다음과 같이 말했습니다. 어서, 어서, 내 계정을 사용하여 홈 애플리케이션에 로그인할 수 있습니다. 당신은 OAuth2.0 프로토콜 표준을 따릅니다. 따라서 제3자 소셜 계정 로그인은 많은 신흥 애플리케이션의 선택이 되었습니다. Tencent의 공식 WeChat 오픈 플랫폼의 온라인 문서는 최신 SDK와 다소 다르며 로그인 관련 문서의 구조적 순서가 다소 혼란스럽기 때문입니다. WeChat 오픈 플랫폼의 공식 온라인 문서를 정리하기 위해 오늘 여기에 내 경험을 기록해 보세요. 동시에 WeChat 공유는 자신의 APP의 영향력을 확장할 수 있으므로 WeChat 공유 기능은 많은 개발자에게 필요한 기능이기도 합니다. 같은 분야에 종사하는 미래의 친구들에게 도움이 되길 바라면서 여기에 정리했습니다.
WeChat 로그인
다음 내용은 Tencent Open Platform에서 발췌했습니다: https://open.weixin.qq.com /cgi -bin/show문서?action=dir_list&t=resource/res_list&verif y=1&id=open1419317851&token=6bfe3acd2969037c7217667f24f8eeaf714e5113&lang=zh_CN
승인 프로세스 설명
WeChat OAuth2.0 인증된 WeChat 로그인 사용자 WeChat ID는 제3자 애플리케이션이나 웹사이트에 로그인할 수 있도록 안전 합니다. WeChat 사용자가 WeChat OAuth2.0에 연결된 제3자 애플리케이션에 로그인하도록 승인하면 제3자가 다음 작업을 수행할 수 있습니다. 사용자의 인터페이스 호출 자격 증명(access_token)을 획득하고, access_token을 통해 WeChat 개방형 플랫폼의 인증 관계 인터페이스를 호출하여 WeChat 사용자의 기본 공개 정보를 획득하고 사용자가 기본 개방을 실현하도록 돕습니다. 기능.
WeChat OAuth2.0 인증 로그인은 현재 Authorization_code 모드를 지원하며, 이는 서버측 애플리케이션 인증에 적합합니다. 이 모델의 전체 프로세스는 다음과 같습니다.
1. 제3자가 WeChat 인증 로그인 요청을 시작합니다. WeChat 사용자가 제3자 애플리케이션 인증을 허용하면 WeChat이 애플리케이션을 실행하거나 다음으로 리디렉션됩니다. 제3자 웹사이트에 접속하고 Authorize 임시 티켓 코드 매개변수를 가져옵니다.
2. code 매개변수를 통해 AppID 및 AppSecret을 추가하고 API를 통해 access_token을 교환합니다. 🎜>
3. Pass access_token은 사용자의 기본 데이터 리소스를 얻거나 사용자가 기본 작업을 구현하도록 돕기 위해 인터페이스를 호출합니다.
access_token 시퀀스 다이어그램 가져오기:
참고: 개발자가
로그인 인터페이스를 호출해야 하는 경우 개발자 인증이 필요하며 제출됩니다. 300다양, 공식 온라인 문서에는 비용을 지불할 필요가 없다고 되어 있습니다. 사실 그런 일은 이미 지났지만 온라인 문서는 업데이트되지 않았습니다. 위챗 인증 로그인 과정을 순서대로 설명하겠습니다. 모든 네트워크 요청은 GET 요청입니다.
1. 임시 티켓 코드 받기
2. access_token 및 openid 받기
3. 🎜 >
임시 티켓 코드 받기
오른쪽을 가리키는 처음 세 개의 화살표
{ // 发出授权申请 Final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_微信登录,分享demo_test"; api.sendReq(req); }왼쪽을 가리키는 두 개의 화살표의 과정이 코드에 반영됩니다.
public void onResp(BaseResp resp) ;// 这个回调接口位于IWXAPIEventHandler中반환되는 데이터는 로그인 인증을 요청하는 데 사용되는 경우 SendAuth.Resp의 인스턴스입니다.
ErrorCode: ERR_OK = 0(사용자 동의); ERR_AUTH_DENIED = -4(사용자 승인 거부) ERR_USER_CANCEL = -2(사용자 취소)
코드: 사용자는 access_token을 교환합니다. ErrCode가 0인 경우에만 유효합니다.
상태: 요청을 보낼 때 요청의 고유성을 식별하기 위해 타사 프로그램에서 사용하는 플래그가 전달됩니다. 타사 프로그램이 sendReq를 호출하고 WeChat 터미널에서 전송될 때 상태
문자열lang:微信客户端当前语言
country:微信客户端当前国家
以上数据均以static String形式存在SendAuth.Resp的resp对象中。
注意:当使用微信提供最新的SDK/library时,上面有些数据是不存在,微信开放平台的文档和API及SDK没有同步更新。读者可使用最下方微信登录,分享demo中的笔者使用的jar包构建工程。
获取access_token & openid
最后一条向右的箭头表示:使用得到的code,获取access_token,openid,接口为:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
注意:微信的接口链接是使用SSL的安全链接,普通的HttpClient访问会导致应用崩溃或报错,详细方法请下载最下方的微信登录,分享demo代码
参数说明
appid: 应用唯一标识,在微信开放平台提交应用审核通过后获得
secret:应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code :填写第一步获取的code参数
grant_type:固定值,填authorization_code
最下方向左的箭头表示使用code访问完链接返回的数据,json携带的数据有:
access_token:接口调用凭证
expires_in:access_token的有效期,一般为7200(秒),也即是两小时
refresh_token:用户刷新access_token
openid:授权用户唯一标识
scope:用户授权的作用域,使用逗号(,)分隔
检查access_token是否有效
由于access_token有效期为两小时,所以进行下一步操作前最好进行一次检查,接口为:
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
传入的参数为accesss_token和openid。
access_token有效时返回的json是:
{ "errcode":0,"errmsg":"ok" }
失效时的返回数据为:
{ "errcode":40003,"errmsg":"invalid openid" }
如果access_token有效,则跳过下一步,失效时需要刷新或续期access_token。
刷新或续期access_token
接口说明
access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:
1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
刷新accessToken接口为:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
参数说明:
appid:应用唯一标识
grant_type:固定值,填refresh_token
refresh_token:填写前面获取到的refresh_token的值
返回的json数据有:
access_token:接口调用凭证
expires_in:access_token接口调用凭证超时时间,单位(秒)
refresh_token:用户刷新access_token
openid:授权用户唯一标识
scope:用户授权的作用域,使用逗号(,)分隔
获取微信用户详细信息
获取access_token,openid后,就可以用来获取更多用户信息,比如微信昵称,头像,性别等。接口为:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
可获取的json携带的数据有:
openid:普通用户的标识,对当前开发者帐号唯一
nickname:普通用户昵称
sex:普通用户性别,1为男性,2为女性
province:普通用户个人资料填写的省份
city:普通用户个人资料填写的城市
country:国家,如中国为CN
headimgurl:用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
privilege:用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
unionid:用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。
微信官方建议:
开发者最好保存unionID信息,以便以后在不同应用之间进行用户信息互通。
微信登录的流程结束了, 至于开发者需要将那些用户信息上传到自家的app服务器就取决于开发者了。
微信分享
1、微信分享分为微信好友分享,朋友圈分享,当然,还有收藏也是共用分享的接口,无需授权登录即可调用分享接口。
2、由于好友分享,朋友圈分享和收藏只是一个参数的区别,所以下面只讲好友分享,具体的可以下载最下方的微信登录,分享demo源码进行查看。
3、微信可以分享的内容包括,纯文字,图片,链接,音乐,视频,app,emoji表情等。
微信分享流程
1、在你的工程里面新建一个wxapi包,并且新建一个WXEntryActivity,继承Activity,或其他Activity(这两步是必须的,微信开发文档中有提到),详见:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN
2、并在manifest文件里面加上exported属性,设置为true。
3、实现一个IWXAPIEventHandler接口。
微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下:
api.handleIntent(getInent(),this);
当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。
注意
如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:
-keep class com.tencent.mm.sdk.** { *; }
微信分享详细代码流程是:
IWXAPI api = WXAPIFactory.createWXAPI(this, APP_ID, false);// 传入申请到的appid,得到一个IWXAPI的实例 api.registerApp(APP_ID);// 将app注册到微信列表,我不知道这是什么意思,有知道的请告诉我,谢谢! // 开始分享纯文本到给好友 WXTextObject textObj = new WXTextObject(); textObj.text = text; // 用WXTextObject对象初始化一个WXMediaMessage对象 WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = textObj; // 发送文本类型的消息时,title字段不起作用 // msg.title = "Will be ignored"; msg.title = "分享文字标题"; msg.description = text; // 构造一个Req SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("text"); // transaction字段用于唯一标识一个请求 req.message = msg; req.scene = SendMessageToWX.Req.WXSceneTimeline;// 表示发送场景为朋友圈,这个代表分享到朋友圈 // req.scene = SendMessageToWX.Req.WXSceneSession;//表示发送场景为好友对话,这个代表分享给好友 // req.scene = SendMessageToWX.Req.WXSceneFavorite;// 表示发送场景为收藏,这个代表添加到微信收藏 // 调用api接口发送数据到微信 api.sendReq(req);
上面大致的表现了一个分享纯文本给好友的场景,如果需要分享到朋友圈,只需要更改req.scene字段值。
1、其中IWXAPI.registerAPP(APP_ID)是官方demo中的一行代码,表示的是将app注册到微信列表,我并不知道有什么用,所谓的微信列表出现在哪儿?该行代码删除后,仍然可以获取登录授权,实现分享等功能。有知道的请告诉我,谢谢!
2、目前笔者遇到无法分享在线图片WXImageObject的问题,分享在线图片时出现分享界面右上角“发送”按钮灰色,无法点击的情况,希望分享成功的朋友告诉我,谢谢!问题如下图
要分享链接,图片,音乐,视频等需要将WXTextObject 对象改成对应的obj对象。详细请下载文章下方的微信登录,分享demo。
后记
由于微信官方demo中并未提供微信登录的代码示例,分享的代码很齐全,可是分享在线图片的代码在我这里却又问题,所以笔者将自己的一些经验和遇到的坑总结在这里,包括了微信第三方登录,微信分享的内容,希望对大家有所帮助。也希望笔者在文中提到的问题有热心人能够解答
//1、 注册到微信列表有什么用,微信列表在哪儿可以看到 IWXAPI.registerApp(APP_ID); //2、 我为什么无法使用以下代码分享在线图片 WXImageObject imgObj = new WXImageObject(); imgObj.imageUrl = imgUrl;// 在线图片链接 WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = imgObj; Bitmap bmp = BitmapFactory.decodeStream(new URL(url).openStream()); Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true); bmp.recycle(); msg.thumbData = Util.bmpToByteArray(thumbBmp, true); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("img"); req.message = msg; req.scene = isTimelineCb.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession; api.sendReq(req);
最近有人向我反映生成的apk无法正常运行。在此进行解释:
데모 소스코드로 생성된 apk가 정상적으로 실행되지 않는 이유는 위챗 오픈플랫폼에 애플리케이션을 추가할 때 패키지명, 애플리케이션 서명, app_id가 바인딩되어 있기 때문입니다. 서명한 APK가 작동하지 않으며, 데모 코드는 참조 및 통신용으로만 사용됩니다.
위 내용은 안드로이드 개발 WeChat 인증 로그인 및 WeChat 공유 분석에 대한 자세한 그래픽 및 텍스트 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!