前提:

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分享相关推荐

  1. iOS 学习 - 13.微信分享链接、QQ 分享图片

    准备工作---原文来自这个 首先要在微信开放平台申请 AppID 和 QQ ID(我第一天晚上申请的,第二天中午就通过了),接着导入 SDK,也就是3个 .h 和一个 .a 文件,详情见这里 如果你是 ...

  2. 微博,微信,微信朋友圈,QQ分享工具类ShareUtil

    一.去各自所在的开发者平台注册相应的Key值:引入相关jar包.权限等 二.ShareUtil工具类 import android.app.Activity; import android.conte ...

  3. android开发qq分享图片,android qq分享图片_android qq分享sdk_android qq分享

    AndroidQQ空间分享博客分类:Android分享先上图:QZoneShareActivity.java:Java代码packagecom.cz.hello.activity;importjava ...

  4. uni-app - H5 公众号网页分享到微信朋友圈 / 转发分享给朋友好友 / 分享到手机 QQ / 分享到 QQ 空间,给微信分享卡片设置图标、标题、描述文字等(JS-SDK 通用解决方案放心用)

    前言 如果您是纯 Vue.js 项目(或 Nuxt.js),请访问 Vue - 最新网页 H5 分享到微信朋友圈 / 转发分享好友 这篇详细教程. 目前网上大部分教程都过时了(老版本.无效),并且未对 ...

  5. 支付精灵-支付宝-微信-聚合支付-给大家分享一个聚合支付的工具

    想必很多人个人开发者和我有同样的感触,想要在自己开发的app中接入微信支付和支付宝支付,仅仅是去申请支付接口就把我们挡在了门外,微信和支付宝都只对接企业的,那不是想逼死我们个人开发者吗?一开始使用过w ...

  6. wex5插件追加下载文件预览文件微信微博QQ分享

    documenthandler插件使用方法 目录 1.概述 2.JS调用方法 3.注意事项 概述 documenthandler插件的功能是下载指定url的文件并使用系统注册过的应用打开.支持Andr ...

  7. 最近做手机端,GPS,微信QQ分享总结的问题

    Android端 百度地图: 1.libs包中armeabi下liblocSDK4d.so文件丢失,导致百度定位失效. 微信分享: 1.分享App,app的内容(图片加描述)不能超过32kb ,不然无 ...

  8. [iOS]分享文件到QQ好友或微信好友

    APP中需要将文件分享给QQ和微信好友,常用下面这两种方式. 1.使用系统的UIActivityViewController类发送 2.使用QQ和微信的API分享 UIActivityViewCont ...

  9. flutter微信分享,qq分享

    微信分享 fluwx: ^3.5.0 import 'package:fluwx/fluwx.dart' as fluwx; 使用: 初始化 void initState() {super.initS ...

  10. QQ分享报错 非官方应用(错误码:901102)

    现象描述 分享至QQ时失败,提示非官方应用(错误码:901102),之前还是正常的,最近分享链接至QQ好友时出现该提示,如图所示: 我们是使用友盟分享SDK接入QQ分享的,友盟SDK日志显示[ 200 ...

最新文章

  1. cpu序列号唯一吗_手机CPU天梯图2020年1月最新版 你的手机处理器排名高吗?
  2. 开发进阶:Dotnet Core多路径异步终止
  3. 【原创】Performanced C++ 经验规则 第五条:再谈重载、覆盖和隐藏
  4. shell查询年月日(可以作为crontab判断年月日)
  5. Java Web学习总结(40)——JSP中的Application对象和Session对象常用方法详解
  6. 面试必选要掌握的知识(持续更新)
  7. 电气自动化和计算机专业比较,高考专业自动化专业和电气工程及其自动化的区别 哪个好...
  8. 彻底删除顽固dll文件
  9. 计算机怎么接多元一次方程,Excel求解多元一次、一元二次方程组就是这么简单!...
  10. 国内的9家域名顶级注册商
  11. iOS APP打开微信小程序
  12. php 七牛云获得上传token,客户端生成七牛上传token
  13. 用javascript写一个简单的登录表单,包含用户名、密码和手机号码。提交数据时验证用户名、密码和手机号输入格式。
  14. 正则表达式re库 python3
  15. 一个总是令人记不住的vectorvectorPoint
  16. 小程序中使用web-view链接H5网页
  17. 程序,批量启动程序脚本
  18. Proj.NET-地球椭球体、大地基准面及地图投影
  19. 【第三弹】经典移植至IOS端、经典合集
  20. 3Dmax中obj文件的导入导出(以3Dmax2017版为例)

热门文章

  1. vue 动态控制input的disabled属性的方法
  2. LRN 局部归一化处理
  3. IDEA如何在git上将分支代码合并到主干(master)
  4. 视频教程-数据分析快速实践:企业真实案例精讲-Python
  5. CentOS7安装Go环境
  6. 头文件里面声明的函数,到底加extern好还是不加extern呢?加不加都一样,默认是EXTERN。有时候没包含头文件编译也能找到函数,不报错只警告
  7. Kafka启动不成功日志报错
  8. 在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结
  9. web页面性能优化方法总结
  10. 8位双向移位寄存器verilog设计