关于不使用微信SDK实现微信分享,转发朋友圈以及微信支付的战斗过程

微信分享,转发朋友圈

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发向微信的信息就会被我们模拟的微信截留

在模拟微信的项目中,需要设置一个Url type,内容为: weixin
截屏2022-06-30 11.17.35.png
   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)
      }

支付宝开放平台传送门

你可能感兴趣的:(关于不使用微信SDK实现微信分享,转发朋友圈以及微信支付的战斗过程)