目前手头的项目终于算是收尾了,在项目进行的过程中遇到的问题在接下来的时间里,我会抽空整理出来,免得以后踩坑,也是为了便于以后的开发工作。
这次就主要说一下微信三方登录、分享和支付的集成工作
1.微信三方库的集成
集成三方库就不用多说了,主要就是手动集成和使用pod导入。详情可看微信开发者平台官方文档介绍
2.微信三方登录的实现
微信三方库成功加入到当前项目中之后,恭喜你已经完成了一半的工作了。接下来我们来看微信三方登录的实现。先来一张微信官方的时序图:
从图中我们可以看出,实现微信登录主要分为三大步骤(简称三步走),即:
- 第三方应用(即自己的应用)发起微信授权登录请求,用户允许授权后,微信会重定向到自己的应用,并且返回授权临时票据code参数;
- 第三方应用利用授权临时票据code、AppID、AppSecret等来换取access_token(这个token是微信用户三方授权登录的token,别跟自己应用的token搞混淆);
- 通过access_token调用接口,获取用户基本数据资源。
只要搞懂把握好这三步走战略,胜利之门始终为你敞开。
接下来详细说说三步走战略的具体内容:
a. 请求code
要想得到授权临时票据,就需要自己的应用想微信终端发送请求并拉起微信应用进行授权登录,用户确认后,微信将会重定向返回到自己的应用,并返回code。
iOS平台授权登录代码示例:
-(void)sendAuthRequest {
//构造SendAuthReq结构体
SendAuthReq* req =[[[SendAuthReq alloc ] init ] autorelease ];
req.scope = @"snsapi_userinfo" ;
req.state = @"123" ;
//第三方向微信终端发送一个SendAuthReq消息结构
[WXApi sendReq:req];
}
b. 获取access_token
获取到code之后,就开始三步走战略的第二步了,获取access_token:
通过请求微信提供的url来请求获取到access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
很明显的,这就是个GET请求,从url中?
之后的就是请求所需要的参数,分别是appid、secret、code和grant_type,只需要替换=
后面的即可。
至此,我们的第二步战略已经结束
c. 获取用户基本信息
通过上面的第二步走方针,我们获取到了access_token,通过access_token可以换取用户基本信息(用户昵称、性别、省、市、国家、头像等信息),跟第二步走很类似,也是要请求 微信给出的一个url来请求获取到数据。
同样还是GET请求
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
到这里微信的授权登录三步走流程已经结束,通过三步走,我们也获取到了access_token、openid、unionid和其他基本信息,后续的登录流程就要根据实际需求来了。
--------我是后续补充的--------
在使用微信三方登录的时候,往往要先判断一下本机是否安装了微信APP客户端,在WXApi中也封装了检测是否安装微信客户端的方法(是个类方法)。
/*! @brief 检查微信是否已被用户安装
*
* @return 微信已安装返回YES,未安装返回NO。
*/
+(BOOL) isWXAppInstalled;
直接使用[WXApi isWXAppInstalled]
就可以判断是否已经安装了微信客户端
但是,但是,但是:前提是你要把微信添加到白名单中,不然即便你的手机上安装了微信客户端,也同样的返回的是NO
,怎么添加白名单,简单地说,就是在plist
文件中添加如下代码:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
3.微信分享的实现
微信分享及收藏是指第三方App通过接入该功能,让用户可以从App分享文字、图片、音乐、视频、网页至微信好友会话、朋友圈或添加到微信收藏。
微信分享的最主要流程就是根据实际需求,把要分享的DD封装成特定类型的数据,然后发送调起微信分享即可。
分享或收藏的目标场景,通过修改scene场景值实现。
发送到聊天界面——WXSceneSession
发送到朋友圈——WXSceneTimeline
添加到微信收藏——WXSceneFavorite
4.微信支付的实现
支付的最主要流程一般都是放在后台服务器进行的,在客户端主要负责的任务就是在后台统一下单后,根据返回的参数调起微信应用进行付款操作,然后再通过后台查询实际支付结果(微信回调也有支付结果,不过最好是以后台查询为准)。
字段名 | 变量名 | 类型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|---|
应用ID | appid | String(32) | 是 | wx8888888888888888 | 微信开放平台审核通过的应用APPID |
商户号 | partnerid | String(32) | 是 | 1900000109 | 微信支付分配的商户号 |
预支付交易会话ID | prepayid | String(32) | 是 | WX1217752501201407033233368018 | 微信返回的支付交易会话ID |
扩展字段 | package | String(128) | 是 | Sign=WXPay | 暂填写固定值Sign=WXPay |
随机字符串 | noncestr | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,不长于32位。推荐随机数生成算法 |
时间戳 | timestamp | String(10) | 是 | 1412000000 | 时间戳,请见接口规则-参数规定 |
签名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 签名,详见签名生成算法 |
名称 | 描述 | 解决方案 |
---|---|---|
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |
返回结果
名称 | 描述 | 解决方案 |
---|---|---|
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |
总结
与微信相关的三方登录授权、微信支付、微信分享已经全部说完,但是还有一个很大的问题,假设一个应用中有很多地方都需要微信分享或者支付,很多页面都将会写入很多重复性的代码,不利于后期维护和管理,并且微信SDK的回调是在appdelegate中,这样就要使用通知等手段来及时的获取到支付或分享结果,如果这样,弊端很多。你们可以下载微信官方的demo,看看官方demo是怎么处理这些逻辑的,自己也可以参照(最简单的方法就是把微信官方demo中的那个单例类拉到自己项目中用)demo用更好的方法来处理。
官方demo中的处理方法可以用下图来简单说明: