微信分享,转发朋友圈
url: [weixin://app/appid/sendeq/?]
参数:
appid = {
command = 1010;
description = "\U5185\U5bb9";
mediaUrl = "https://www.baidu.com";
objectType = 5;
result = 1;
scene = 1;
sdkver = "1.8.7.1";
thumbData = {length = 3490, bytes = 0xffd8ffe0 00104a46 49460001 01000048 ... a4145145 4947ffd9 };
title = "\U6807\U9898";
}
完整代码
let data = UIImage(name: "voice_cancel").jpegData(compressionQuality: 1)
let dic = ["result":"1","command":"1010","scene":"1","sdkver":"1.8.7.1","title":"234567","mediaUrl":"https://www.baidu.com","thumbData":data as Any,"objectType":5] as [String : Any]
let dic1 = ["appid":dic]
if let data = try? PropertyListSerialization.data(fromPropertyList: dic1, format: .binary, options: 0){
UIPasteboard.general.setData(data, forPasteboardType: "content")
if let url = URL.init(string: "weixin://app/appid/sendreq/?") {
UIApplication.shared.open(url)
}
}
上述代码是一个完整的微信转发朋友圈的示例,微信分享与转发朋友圈只是参数不一样。
参数讲解
result 固定参数
command 固定参数
scene 场景 0 为分享到好友 1 为分享到朋友圈
description 分享的副标题,分享到好友的参数
mediaUrl 分享出来的链接 朋友圈和好友均有
objectType 分享到朋友圈必传参数 固定为5
sdkver 选填
thumbData 分享出来的图片
title 分享的标题
appid 微信开放平台的应用的appid 必填
微信支付
url: [weixin://app/appid/pay/?]
完整代码
- (void)payAction{
//发起网络请求,去你们服务器请求1.订单id,2. 钱(单位:分),3. 内容描述
//订单最好服务器生成,本文为了各位看的明白,所以在本地生成!
[NetWorkTool dingiD:[self generateTradeNO] andDetail:@"描述" success:^(NSDictionary *responseObject) {
/** appid */
NSString *appid = responseObject[@"result"][@"appid"];
/** 商家向财付通申请的商家id */
NSString *partnerId = responseObject[@"result"][@"partnerid"];
/** 预支付订单 */
NSString *prepayId = responseObject[@"result"][@"prepayid"];
/** 随机串,防重发 */
NSString *nonceStr = responseObject[@"result"][@"noncestr"];
/** 时间戳,防重发 */
NSString *timeStamp = responseObject[@"result"][@"timestamp"];
/** 商家根据财付通文档填写的数据和签名 */
NSString *package = responseObject[@"result"][@"package"];
/** 商家根据微信开放平台文档对数据做的签名 */
NSString *sign = responseObject[@"result"][@"sign"];
//生成URLscheme
NSString *str = [NSString stringWithFormat:@"weixin://app/%@/pay/?nonceStr=%@&package=Sign%%3DWXPay&partnerId=%@&prepayId=%@&timeStamp=%@&sign=%@&signType=SHA1",appid,nonceStr,partnerId,prepayId,[NSString stringWithFormat:@"%d",[timeStamp intValue] ],sign];
//通过openURL的方法唤起支付界面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
} failure:^(NSError *error) {
NSLog(@"%@",error);
}];
}
上述是一个完整代码的过程,参数没得啥讲解的,都是由后端返回的
参考传送门
使用SDK和不使用SDK的个人总结
实际上,大部分时候,我们都是使用的微信SDK方式,因为集成快捷,使用方便,当然,也会一定程度的增加包的大小,而且,微信SDK会导入一些系统库,这可能造成和一些其他第三方库之间的不兼容(极其少见)。
那么,不使用SDK存在的意义在哪里呢。首先,像单纯的支付,不使用SDK,虽然需要单独处理一下回调数据,但是个人感觉还是比使用SDK方便。当然,不使用SDK最大的作用,个人感觉还是用于手机浏览器。比如,一个H5的网页,分享到手机微信。一个H5的游戏,分享/支付到微信。因为没有实际的RN,Flutter开发项目,不敢断言这个方法是否可以适用于其开发,如果可以的话,是不是就节约了相关成本?
追溯过程
思想
微信SDK其实也是通过urlScheme的方式与微信进行的沟通,那么我们模拟一个微信,然后用已经集成好微信SDK,并调试无误的工程,模拟微信分享,这个时候,微信SDK发向微信的信息就会被我们模拟的微信截留
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
return true
}
在模拟微信的上述方法就能看看微信SDK发送的信息,
实际上,在最开始的时候,的确可以采用这种方式获取到微信的url以及参数,但是后来微信把参数单独处理了,参考上面分享到好友的参数处理就可以发现,微信把参数通过剪切板的方式进行了处理,因为还不是字符串方式,所以正常还不能复制出来,的确有点狗贼,但是还好,没有进过其他加密方法,不然就没戏了,说明某种程度上,微信开发还是默认了此种行为。
微信SDK采用的把参使用Plist归档成Data,然后把Data放到剪切板上面。以下是解析参数数据:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
if let data = UIPasteboard.general.data(forPasteboardType: "content") {
if let dic = try? PropertyListSerialization.propertyListFromData(data, mutabilityOption: .mutableContainers, format: nil, errorDescription: nil) {
print(dic)
}
}
return true
}
放一个完整的数据,测试的一个分享到朋友圈的数据,感兴趣的朋友可以自己研究看看
appid = {
command = 1010;
description = "\U5185\U5bb9";
disableForward = 0;
isAutoResend = 0;
mediaUrl = "https://www.baidu.com";
miniprogramType = 0;
objectType = 5;
result = 1;
returnFromApp = 0;
scene = 1;
sdkver = "1.8.7.1";
thumbData = {length = 3490, bytes = 0xffd8ffe0 00104a46 49460001 01000048 ... a4145145 4947ffd9 };
title = "\U6807\U9898";
universalLink = "https://www.baidu.com";
weworkObjectSubType = 0;
withShareTicket = 0;
}
附一个打跳转到支付宝并打开指定Url的方法,urlString就是指定的url,该方法是支付宝官方方法,appId=20000067是固定参数,也就是说,不需要任何支付宝平台的资料,也不需要注册支付宝开发平台,就能直接使用此方法
if let url = URL.init(string: "alipays://platformapi/startapp?appId=20000067&url=\(urlString)") {
UIApplication.shared.open(url)
}
支付宝开放平台传送门