微信分享(支付)和QQ分享
前提:
Xcode12.5+下载真机调试dmg
微信SDK(WechatOpenSDK)1.8.7.1
QQ互联SDK(TencentOpenApi(Lite)_3.5.3.62)
生成app应用时需要勾选Associated Domains ,不然在后面编译的时候会报错的。(我记得xcode10是在本地就可以勾选的,但是xcode12没有这个开发)
part1 -->微信朋友列表和朋友圈<--
1)网站上上传apple-app-site-association文件,为了兼容版本,可以在根目录和子目录”.well-know”都传一份,格式大概是这样的
假设开发组id=“AB12345678”;产品的bundle id=“com.xxx.app” 网站=https://123test.com
为了简单起见,一个站点只一个APP,所以paths直接填*,如果多个app需要慎重填写。
{"applinks": {"apps": [],"details": [{"appID": "AB12345678.com.xxx.app","paths": ["*"]}]}
}
2)申请微信移动应用APPID
填写bundle id(com.xxx.app)和网站Universal Link(Free tests that take you further! | 123test.com),还有App Store id,这个需要在appstoreconnect.apple.com先创建一个产品(实际上填写了一些产品信息),然后保存就可以得到一个id,申请下来一个微信的appid(wx12345678)。
下载WechatOpenSDK,然后是配置info.list
LSApplicationQueriesSchemes 添加两个值
weixin
weixinULAPI
这些值主要为了跳转调用使用
Signing&Capabilities 中Associatied Domains
添加applinks:123test.com (这个对微信分享没影响,但是对qq分享有影响的)
最后就是代码:
启动完成后就是注册这个(微信支付公用这行代码的)
[WXApi registerApp:@“wx12345678” universalLink:@"https://123test.com"]
发起分享
WXMediaMessage *message = [WXMediaMessage message];message.title = @“标题”;message.description = @“描述”;//图片记得压缩一下64k以内(安卓好像是32k)if (image) {[message setThumbImage:image];//分享图片,使用SDK的setThumbImage方法可压缩图片大小}// 多媒体消息中包含的网页数据对象WXWebpageObject *webpageObject = [WXWebpageObject object];// 网页的url地址webpageObject.webpageUrl = link; //链接message.mediaObject = webpageObject;SendMessageToWXReq *sendReq = [[SendMessageToWXReq alloc] init];sendReq.bText = NO;sendReq.message = message;sendReq.scene = flag; //0=好友列表 1=朋友圈 2=收藏夹 3=。。。看记录[WXApi sendReq:sendReq completion:^(BOOL success) {//OK}];
回调(返回app)在AppDelegate.m里面处理:
//设置Universal Links系统回调
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler{//NSLog(@"userActivity.webpageURL=%@",userActivity.webpageURL);//NSLog(@"restorationHandler=%@",restorationHandler);if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]){NSURL *webpageURL = userActivity.webpageURL; //https://123test.com/wx12345678/if (webpageURL) {if ([webpageURL.absoluteString rangeOfString:@“wx12345678”].length){ // 微信BOOL flag=[WXApi handleOpenUniversalLink:userActivity delegate:(id)self];[WXApi handleOpenURL:url delegate:self]; //旧版兼容,可以忽略return flag;}}}return YES;
}
上面是微信分享部分代码,下面提一下微信支付几个坑。
微信支付的前提是上面的微信分享已经调通。
客户端上能做不多,第一步发起订单请求,然后服务器根据订单向微信发起支付请求,返回一串类似这样的json字符串
{"return_code":"SUCCESS","return_msg":"OK","result_code":"SUCCESS","mch_id”:”…,”appid”:”…”,”nonce_str”:”…”,”sign”:”..”.,”prepay_id”:”…”,”trade_type":"APP"}
然后就是通过SDK向微信APP传递信息,打开微信。在分享成功的基础上,微信支付几乎水到渠成的。但是还有2个坑。
1.“商户传入的appid参数不正确,请联系商户处理”:第一步在微信开发应用账户上申请支付功能,和商家id关联;第二步就是服务器上签名要用到移动应用的appid,所以安卓和iOS需要区分处理。有人说订单2小时失效也是这样提示,貌似不对,我用新版微信测试过,上面明明白白提示“订单超时失效”之类的。
2.“签名验证失败”:我们第一次是因为使用了移动应用的appid和AppSecret,行不通(就算改了sign也一样失败,确定是不能用这个AppSecret),后来和安卓等使用统一的AppSecret,还有就是将回传的sign值改为其他值(就是不能与回传的那个字符串相同),然后就成功支付。。。
part2 -->QQ和QQ空间分享<—-
QQ互联上申请APPID,假设拿到URL Schema=“QQ12345678xx” Universal Link=“https://123test.com/qq_conn/1234567899/” 实际上APPID=“1234567899” 实际上在info的URL Types里面只需要填写“tencent+appid”(tencent1234567899)就可以了,那个“QQ12345678xx”根本没用上,保险起见也加上吧。
修改网站apple-app-site-association文件
{"applinks": {"apps": [],"details": [{"appID": "AB12345678.com.xxx.app","paths": ["*"]},{"appID": “AB12345678.com.xxx.app","paths": ["*","/qq_conn/1234567899/*”]}]}
}
修改info.list:
LSApplicationQueriesSchemes 添加值
mqq
mqqapi
mqqwpa
mqqbrowser
mqqOpensdkSSoLogin
mqqopensdkapiV2
mqqopensdkapiV3
mqqopensdkapiV4
mqqopensdknopasteboard
wtloginmqq2
mqzone
mqzoneopensdk
mqzoneopensdkapi
mqzoneopensdkapi19
mqzoneopensdkapiV2
mqqapiwallet
mqqopensdkfriend
mqqopensdkdataline
mqqgamebindinggroup
mqqopensdkgrouptribeshare
tencentapi.qq.reqContent
tencentapi.qzone.reqContent
(新版实际调试中,我只发现用到mqqapi和mqqopensdknopasteboard,其他的都是网上抄过来的)
QQ互联一定要用到: (Xcode12.5)Signing&Capabilities->Associated Domains添加一项“applinks:123test.com”,这里一般要按照申请qq互联时候填写的Universal Link去掉https头。注意applinks:后面不要自作主张加//。这里出错了,可能会提示“设备未授权(错误码25105)”,就算其他的都对了,怎么找也找不到问题的时候,看看这段话。出现错误码25105需要怀疑的地方有4个:1.网站上的apple-app-site-association;2.applinks的填写;3.info.list里面LSApplicationQueriesSchemes的设置;4.info.list的URL Types(前面提到,授权应该和这个没多大关系吧,和那个相应关系更大)
代码也是三段式的。
1. 注册授权
[[TencentOAuth alloc] initWithAppId:QQAPPID andUniversalLink:QQULink andDelegate:(id)delegate]; //这个返回值需要保存下来的,可以考虑做一个全局变量
2. 分享
QQApiNewsObject *newsObj = [QQApiNewsObjectobjectWithURL:[NSURL URLWithString:link]title:titledescription:descpreviewImageURL:thumb_url];SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];if (mode == 0){QQApiSendResultCode code = [QQApiInterface sendReq:req];//NSLog(@"QQ好友列表分享 - %d",code);if (code==EQQAPISENDSUCESS) {}}else if (mode == 1){QQApiSendResultCode code = [QQApiInterface SendReqToQZone:req];//NSLog(@"QQ空间分享 - %d",code);if (code==EQQAPISENDSUCESS) {}}
3.处理回应
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler;
{
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]){NSURL *webpageURL = userActivity.webpageURL;NSLog(@"webpageURL=%@",webpageURL);if (webpageURL) {if([webpageURL.scheme isEqualToString:[NSString stringWithFormat:@"tencent%@",QQAPPID]]) //这个没跑进来,我随便写的{return [TencentOAuth HandleUniversalLink:webpageURL];}else if([TencentOAuth CanHandleUniversalLink:webpageURL]) //这个判断好像不行,我随便写的{return [TencentOAuth HandleUniversalLink:webpageURL];}}}return NO;
}- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{//SDK3.5.1点返回app后是跳到这里的url格式是 “tencent{appid}://response_from_qq?xxxxxx”if ([url.scheme isEqualToString:[NSString stringWithFormat:@"tencent%@",QQAPPID]]){return [QQApiInterface handleOpenURL:url delegate:(id)self];}
}- (void)onReq:(id)req
{//else if([[req class] isSubclassOfClass:[QQBaseReq class]])//{// //处理来自QQ的请求//}
}- (void)onResp:(id)resp
{//if([[resp class] isSubclassOfClass:[QQBaseReq class]])//{// // 处理来至QQ的响应 //}
}
QZone分享后直接自动返回;QQ分享需要选择点击返回或留在QQ上。
如果想知道放弃分享,通过
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
能提取到的:
tencent{qq-appid}://response_from_qq?error_description=dGhlIHVzZXIgZ2l2ZSB1cCB0aGUgY3VycmVudCBvcGVyYXRpb24=&appsign_bundlenull=2&source=qq&source_scheme=mqqapi&error=-4&version=1
将描述base64解一下,得到“the user give up the current operation”。
分享成功大概是这样的:
tencent{qq-appid}://response_from_qq?appsign_bundlenull=2&source=qq&source_scheme=mqqapi&error=0&version=1
如果只是分享,不管结果,理论上是不用处理
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler; //QQ互联 SDK3.5.1没有跑这里来
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options; //QQ互联 SDK3.5.1跑这里来
- (void)onReq:(id)req ; - (void)onResp:(id)resp;
总结有点混乱,表达有点欠缺。。。
微信分享(支付)和QQ分享相关推荐
- iOS 学习 - 13.微信分享链接、QQ 分享图片
准备工作---原文来自这个 首先要在微信开放平台申请 AppID 和 QQ ID(我第一天晚上申请的,第二天中午就通过了),接着导入 SDK,也就是3个 .h 和一个 .a 文件,详情见这里 如果你是 ...
- 微博,微信,微信朋友圈,QQ分享工具类ShareUtil
一.去各自所在的开发者平台注册相应的Key值:引入相关jar包.权限等 二.ShareUtil工具类 import android.app.Activity; import android.conte ...
- android开发qq分享图片,android qq分享图片_android qq分享sdk_android qq分享
AndroidQQ空间分享博客分类:Android分享先上图:QZoneShareActivity.java:Java代码packagecom.cz.hello.activity;importjava ...
- uni-app - H5 公众号网页分享到微信朋友圈 / 转发分享给朋友好友 / 分享到手机 QQ / 分享到 QQ 空间,给微信分享卡片设置图标、标题、描述文字等(JS-SDK 通用解决方案放心用)
前言 如果您是纯 Vue.js 项目(或 Nuxt.js),请访问 Vue - 最新网页 H5 分享到微信朋友圈 / 转发分享好友 这篇详细教程. 目前网上大部分教程都过时了(老版本.无效),并且未对 ...
- 支付精灵-支付宝-微信-聚合支付-给大家分享一个聚合支付的工具
想必很多人个人开发者和我有同样的感触,想要在自己开发的app中接入微信支付和支付宝支付,仅仅是去申请支付接口就把我们挡在了门外,微信和支付宝都只对接企业的,那不是想逼死我们个人开发者吗?一开始使用过w ...
- wex5插件追加下载文件预览文件微信微博QQ分享
documenthandler插件使用方法 目录 1.概述 2.JS调用方法 3.注意事项 概述 documenthandler插件的功能是下载指定url的文件并使用系统注册过的应用打开.支持Andr ...
- 最近做手机端,GPS,微信QQ分享总结的问题
Android端 百度地图: 1.libs包中armeabi下liblocSDK4d.so文件丢失,导致百度定位失效. 微信分享: 1.分享App,app的内容(图片加描述)不能超过32kb ,不然无 ...
- [iOS]分享文件到QQ好友或微信好友
APP中需要将文件分享给QQ和微信好友,常用下面这两种方式. 1.使用系统的UIActivityViewController类发送 2.使用QQ和微信的API分享 UIActivityViewCont ...
- flutter微信分享,qq分享
微信分享 fluwx: ^3.5.0 import 'package:fluwx/fluwx.dart' as fluwx; 使用: 初始化 void initState() {super.initS ...
- QQ分享报错 非官方应用(错误码:901102)
现象描述 分享至QQ时失败,提示非官方应用(错误码:901102),之前还是正常的,最近分享链接至QQ好友时出现该提示,如图所示: 我们是使用友盟分享SDK接入QQ分享的,友盟SDK日志显示[ 200 ...
最新文章
- cpu序列号唯一吗_手机CPU天梯图2020年1月最新版 你的手机处理器排名高吗?
- 开发进阶:Dotnet Core多路径异步终止
- 【原创】Performanced C++ 经验规则 第五条:再谈重载、覆盖和隐藏
- shell查询年月日(可以作为crontab判断年月日)
- Java Web学习总结(40)——JSP中的Application对象和Session对象常用方法详解
- 面试必选要掌握的知识(持续更新)
- 电气自动化和计算机专业比较,高考专业自动化专业和电气工程及其自动化的区别 哪个好...
- 彻底删除顽固dll文件
- 计算机怎么接多元一次方程,Excel求解多元一次、一元二次方程组就是这么简单!...
- 国内的9家域名顶级注册商
- iOS APP打开微信小程序
- php 七牛云获得上传token,客户端生成七牛上传token
- 用javascript写一个简单的登录表单,包含用户名、密码和手机号码。提交数据时验证用户名、密码和手机号输入格式。
- 正则表达式re库 python3
- 一个总是令人记不住的vectorvectorPoint
- 小程序中使用web-view链接H5网页
- 程序,批量启动程序脚本
- Proj.NET-地球椭球体、大地基准面及地图投影
- 【第三弹】经典移植至IOS端、经典合集
- 3Dmax中obj文件的导入导出(以3Dmax2017版为例)
热门文章
- vue 动态控制input的disabled属性的方法
- LRN 局部归一化处理
- IDEA如何在git上将分支代码合并到主干(master)
- 视频教程-数据分析快速实践:企业真实案例精讲-Python
- CentOS7安装Go环境
- 头文件里面声明的函数,到底加extern好还是不加extern呢?加不加都一样,默认是EXTERN。有时候没包含头文件编译也能找到函数,不报错只警告
- Kafka启动不成功日志报错
- 在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结
- web页面性能优化方法总结
- 8位双向移位寄存器verilog设计