10分钟搞定支付宝和微信支付的各种填坑

发表于:2018-4-11 16:16

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:lumic000    来源:简书

#
流程
分享:
  填坑
  支付宝填坑是每个接入支付宝必经之路,下面是我接入支付宝遇到的问题汇总,希望大家在接入的路上少一点弯路
  问题1. Util/base64.h:63:21: Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’
  解决办法:
  这是base64.h中没有加入#import <Foundation/Foundation.h> 系统库文件导致,这个错误报错方法直接想喷它一脸。报错方式太恶心。
  问题2.截图告知你什么问题
  530EA189-0A5A-4AEB-82BF-E30B99F5418B.png
  解决办法:
  这个问题可以同上的,心情好,截图再次说明下,在 openssl_wrapper.h中#import <Foundation/Foundation.h> 库即可
  问题3.Util/openssl_wrapper.m:11:9: ‘rsa.h’ file not found
  解决办法:
  (1),万年老坑,只要你接入支付宝百分百要遇到的问题,所以习以为常吧
  (2),在Build setting中搜索search,找到Header Search Paths,添加$(PROJECT_DIR)/openssl和$(PROJECT_DIR) 如下图:
  (3),重要 问题说三遍,这是网络找到的到答案后继续有同样的坑,自己的解决方案,
  Header Search Paths   $(PROJECT_DIR)/ali中输入这个
  Framework Search Paths  和 Library Search Paths 继续是$(inherited)  和  $(PROJECT_DIR)/ali
  ‘rsa.h’ file not found  的解决方案
  (4),由于后期多项目的接入,让我知道一个算是万能方法吧,就是始终保持Header Search Paths 和 Library Search Paths 都能找到你导入的openssl的正确路径即可,已尝试多遍,是能解决以上问题(求黑)
  EB1487E2-FFA9-494B-923D-C5F7CD1AF1FC.png
  5C736AB8-F0FB-423C-973D-3ED9301E27C0.png
  问题4.这类错很多,大概有这些:这些可能是库文件没有导入,导致的
  “_CNCopyCurrentNetworkInfo”, referenced from:
  Undefined symbols for architecture x86_64:
  "_CNCopyCurrentNetworkInfo", referenced from:
  -[APayReachability wifiInterface] in AlipaySDK
  +[internal_DeviceInfo getSSIDInfo] in AlipaySDK
  +[internal_DeviceInfo getNetworkInfo] in AlipaySDK
  "_CNCopySupportedInterfaces", referenced from:
  -[APayReachability wifiInterface] in AlipaySDK
  +[internal_DeviceInfo getSSIDInfo] in AlipaySDK
  +[internal_DeviceInfo getNetworkInfo] in AlipaySDK
  "_CTRadioAccessTechnologyCDMA1x", referenced from:
  -[AliSecXReachability networkStatusForFlags:] in AlipaySDK
  "_CTRadioAccessTechnologyEdge", referenced from:
  -[AliSecXReachability networkStatusForFlags:] in AlipaySDK
  "_CTRadioAccessTechnologyGPRS", referenced from:
  -[AliSecXReachability networkStatusForFlags:] in AlipaySDK
  "_CTRadioAccessTechnologyLTE", referenced from:
  -[AliSecXReachability networkStatusForFlags:] in AlipaySDK
  "OBJC_CLASS$_CMMotionManager", referenced from:
  objc-class-ref in AlipaySDK
  "OBJC_CLASS$_CTTelephonyNetworkInfo", referenced from:
  objc-class-ref in AlipaySDK
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
  +[APayReachability reachabilityWithAddress:] in AlipaySDK
  +[AliSecXReachability reachabilityWithAddress:] in AlipaySDK
  "_SCNetworkReachabilityCreateWithName", referenced from:
  +[APayReachability reachabilityWithHostname:] in AlipaySDK
  +[AliSecXReachability reachabilityWithHostName:] in AlipaySDK
  "_SCNetworkReachabilityGetFlags", referenced from:
  -[APayReachability isReachable] in AlipaySDK
  -[APayReachability isReachableViaWWAN] in AlipaySDK
  -[APayReachability isReachableViaWiFi] in AlipaySDK
  -[APayReachability connectionRequired] in AlipaySDK
  -[APayReachability isConnectionOnDemand] in AlipaySDK
  -[APayReachability isInterventionRequired] in AlipaySDK
  -[APayReachability reachabilityFlags] in AlipaySDK
  ...
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
  -[AliSecXReachability startNotifier] in AlipaySDK
  "_SCNetworkReachabilitySetCallback", referenced from:
  -[APayReachability startNotifier] in AlipaySDK
  -[APayReachability stopNotifier] in AlipaySDK
  -[AliSecXReachability startNotifier] in AlipaySDK
  "_SCNetworkReachabilitySetDispatchQueue", referenced from:
  -[APayReachability startNotifier] in AlipaySDK
  -[APayReachability stopNotifier] in AlipaySDK
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
  -[AliSecXReachability stopNotifier] in AlipaySDK
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const, unsigned long)", referenced from:
  CAliSecXURL::encodeURIComponent(CAliSecXBuffer&) in AlipaySDK
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::reserve(unsigned long)", referenced from:
  CAliSecXURL::encodeURIComponent(CAliSecXBuffer&) in AlipaySDK
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
  CAliSecXURL::encodeURIComponent(CAliSecXBuffer&) in AlipaySDK
  "std::nothrow", referenced from:
  CAliSecXBuffer::CAliSecXBuffer(unsigned long) in AlipaySDK
  CAliSecXBuffer::_copy(unsigned char const, unsigned long) in AlipaySDK
  CAliSecXBuffer::resize(unsigned long) in AlipaySDK
  "std::terminate()", referenced from:
  ___clang_call_terminate in AlipaySDK
  "operator delete", referenced from:
  CAliSecXBuffer::~CAliSecXBuffer() in AlipaySDK
  CAliSecXBuffer::release() in AlipaySDK
  CAliSecXBuffer::~CAliSecXBuffer() in AlipaySDK
  CAliSecXBuffer::operator=(CAliSecXBuffer const&) in AlipaySDK
  CAliSecXBuffer::resize(unsigned long) in AlipaySDK
  alisec_crypto_Hex2Bin(CAliSecXBuffer const&) in AlipaySDK
  alisec_crypto_Bin2Hex(CAliSecXBuffer const&) in AlipaySDK
  ...
  "operator new[](unsigned long, std::nothrow_t const&)", referenced from:
  CAliSecXBuffer::CAliSecXBuffer(unsigned long) in AlipaySDK
  CAliSecXBuffer::_copy(unsigned char const*, unsigned long) in AlipaySDK
  CAliSecXBuffer::resize(unsigned long) in AlipaySDK
  "___cxa_begin_catch", referenced from:
  ___clang_call_terminate in AlipaySDK
  "___gxx_personality_v0", referenced from:
  +[ASSStorageAccesser saveStorageModel:] in AlipaySDK
  +[ASSStorageAccesser loadStorageModelFromKeychain] in AlipaySDK
  +[ASSStorageAccesser loadPreviousApdid] in AlipaySDK
  +[ASSStorageAccesser getRandomizedID] in AlipaySDK
  +[ASSStorageAccesser getNewRadomizedID] in AlipaySDK
  +[ASSStorageAccesser loadLastLoginTime] in AlipaySDK
  +[ASSStorageAccesser saveCurrentLoginTime:] in AlipaySDK
  ...
  "_deflate", referenced from:
  +[ASSCommonUtils gzipData:] in AlipaySDK
  +[DTGZipUtil compressGZip:] in AlipaySDK
  "_deflateEnd", referenced from:
  +[ASSCommonUtils gzipData:] in AlipaySDK
  +[DTGZipUtil compressGZip:] in AlipaySDK
  "deflateInit2", referenced from:
  +[ASSCommonUtils gzipData:] in AlipaySDK
  +[DTGZipUtil compressGZip:] in AlipaySDK
  "_kCNNetworkInfoKeyBSSID", referenced from:
  +[UIDevice(APEX) networkDic] in AlipaySDK
  "_kCNNetworkInfoKeySSID", referenced from:
  +[UIDevice(APEX) networkDic] in AlipaySDK
  ld: symbol(s) not found for architecture x86_64
  clang: error: linker command failed with exit code 1 (use -v to see invocation)
  解决办法:
  这种问题通过在General->Link Framework and Libraiies中添加以下framework解决:
  - libz.tbd
  - libc++.tbd
  - Security.framework
  - CoreMotion.Framework
  - CFNetwork.framework
  - CoreTelephony.framework
  - SystemConfiguration.framework
  截图如下,由于公司同时接入支付宝和微信支付,所以导入的库就多了点咯:
  9CCA6D99-B122-4C6E-8A1D-522BC3292A4E.png
  问题5.Redefinition of 'RSA' as different kind of symbol 多为sdk集成时产生的坑,因为我们公司在集成支付宝之前,有用过RSA加密,导致重名问题
  解决办法:
  (1),这个问题不是每个公司都可能遇到的,但遇到也心烦
  (2),由于支付宝中的openssl中的rsa.h文件与RSA加密有重名冲突。改掉公司自己之前导入RSA的命名,如果你牛逼也可以去改rsa.h中的
  问题6;系统库导入问题
  +++++++++++++
  symbol(s) not found for architecture arm64
  17321E6C-1A33-41D4-9B6E-9E499CCA23C6.png
  解决办法
  就是导入系统库了
  85880AC4-E323-4451-B622-9E7ABB1CE658.png
  问题7:终于到微信了,接入微信,你就开心了
  因为问题太少了,只能感谢下这两个帖子的楼主了
  解决办法:
  使用微信支付SDK1.5版本的支付demo
  微信支付如果遇到跳转只有一个确定请看这里
  为了一些懒人懒的去看帖子,简单说,就是微信支付注册放在友盟分享之后就ok了!
  代码示例:
  // 友盟分享
      [self configUmengShare];
  //向微信注册
      [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];
  问题8:
  拉起微信支付后,在微信支付注册在友盟之后仍然跳转到微信还是一个确定按钮,点击确定按钮回到自己的应用
  解决办法:
  这个是后端返回的参数有问题,一般是sign签名有问题,
  ************注意:
  1.签名 后端签名是要用到下面6个参数进行签名,appId,partnerId,noncestr,timestamp,package prepaid,签名过程中,6个参数都是小写,签名后字符转为大写,sign字符全是大写
  2.随机串 请求预交易订单返回的
  3.时间戳 订单结束时间
  举例:如下是请求后端返回的数据
    ["appid"]=>
    string(18) "wx5e71abd366954a75"
    ["noncestr"]=>
    string(16) "Ws5NaX2MqdGejNvW"
    ["package"]=>
    string(10) "Sign=WXPay"
    ["partnerid"]=>
    string(10) "1341184101"
    ["prepayid"]=>
    string(36) "wx20160530173622a5292225780182728337"
    ["sign"]=>
    string(32) "322B952AC0678F21DD1F7C5B1F444886"
    ["timestamp"]=>
    int(1464601340)
  }
  把后端返回的sign和自己签名的sign做个比较,native已经认证过,没有错误
  -(NSString *)createMD5SingForPayWithAppID:(NSString *)appid_key partnerid:(NSString *)partnerid_key prepayid:(NSString *)prepayid_key package:(NSString *)package_key noncestr:(NSString *)noncestr_key timestamp:(UInt32)timestamp_key{
      NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
      //签名的6个键值对中的key都必须小写
      [signParams setObject:appid_key forKey:@"appid"];//微信appid 例如wxfb132134e5342
      [signParams setObject:noncestr_key forKey:@"noncestr"];//随机字符串
      [signParams setObject:package_key forKey:@"package"];//扩展字段  参数为 Sign=WXPay
      [signParams setObject:partnerid_key forKey:@"partnerid"];//商户账号
      [signParams setObject:prepayid_key forKey:@"prepayid"];//此处为统一下单接口返回的预支付订单号
      [signParams setObject:[NSString stringWithFormat:@"%u",timestamp_key] forKey:@"timestamp"];//时间戳
     
      
      NSMutableString *contentString  =[NSMutableString string];
      NSArray *keys = [signParams allKeys];
      //按字母顺序排序
      NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
          return [obj1 compare:obj2 options:NSNumericSearch];
      }];
      //拼接字符串
      for (NSString *categoryId in sortedArray) {
          if (   ![[signParams objectForKey:categoryId] isEqualToString:@""]
              && ![[signParams objectForKey:categoryId] isEqualToString:@"sign"]
              && ![[signParams objectForKey:categoryId] isEqualToString:@"key"]
              )
          {
              [contentString appendFormat:@"%@=%@&", categoryId, [signParams objectForKey:categoryId]];
          }
      }
      //添加商户密钥key字段  API 密钥   这里的key需要换成自己公司商户密钥
      [contentString appendFormat:@"key=%@", @"9db35c68b8de2d15d1d493d16fb67875"];
      
      NSString *result = [self md5StringWithString:contentString];//md5加密
      return result;
  }
  /**
   *  MD5 加密
   *
   *  @return 加密后字符串
   */
  - (NSString *)md5StringWithString:(NSString *)str
  {
      if(str == nil || [str length] == 0) return nil;
      unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
      CC_MD5([str UTF8String], (int)[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
      NSMutableString *ms = [NSMutableString string];
      for(i=0;i<CC_MD5_DIGEST_LENGTH;i++)
      {
          [ms appendFormat: @"%02x", (int)(digest[i])];
      }
      
      [ms uppercaseString];
      //转为大写
      NSString *big = [ms uppercaseString];
      NSLog(@"sign %@",big);
      return [big copy];
  }
  这里NSLog后的值为
  2016-05-30 17:41:01.166 FPHClient[15313:6309040] sign 322B952AC0678F21DD1F7C5B1F444886
  和后端返回的一样
  4.partnerId
  问题9:
  拉起支付宝报错:
  交易订单处理失败,请稍后再试(ALI64)
  解决办法:
  重新生成私钥和公钥,执行步骤如下个问题
  问题8:
  支付宝要重新生成私钥和公钥,并上传修改公钥 -- 为你补充
  解决办法:
  RSA密钥生成命令步骤如下:
  (1)先在终端键入 openssl
  生成RSA私钥
  (2)openssl>genrsa -out rsa_private_key.pem 1024
  生成RSA公钥
  (3)openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
  将RSA私钥转换成PKCS8格式
  (4)openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
  注意:“>”符号后面的才是需要输入的命令。
  使用
  WuTiandeiMac:FPHClientNew wutianshi$ openssl
  OpenSSL> 
  OpenSSL> 
  OpenSSL> 
  OpenSSL> 
  OpenSSL> genrsa -out rsa_private_key.pem 1024
  Generating RSA private key, 1024 bit long modulus
  ....................++++++
  .........++++++
  e is 65537 (0x10001)
  OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
  writing RSA key
  OpenSSL> 
  OpenSSL> 
  OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
  -----BEGIN PRIVATE KEY-----
  MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANOjnFDIjeQjyah1
  1smthHNsiHyXE8EOWMyMZkLrIlbu6TCDVHk/hhJTpbDxVOz6f4cFdynP/wD9Tbnf
  ZfJCKFDFJ9jPz3Euyb5/jLFbyAVblyLLPiv5bxRLaA9/w4Jtt+G7E/ti8HN6224x
  4TT3owFuKqZTcAXeqXp7QMzZyEkZAgMBAAECgYBWYKRf5DrlLiYT92Rek89HPLjI
  APEzDiP3+CWUkltFl+Tcw/0qL18NA87QVO8QeXyrIvPrwNSXFssuXZtCMPY6oqgh
  21ixQ+w4Kk4Z8nkEbFNRjryrpOeGMQmZlkSqRiehnYPY6UT8ovKXj0D1HBoscfA7
  z1Ioxpo3QEN3jsxkcQJBAPbgYhJYS7+/HB92eXaHckTpU0/ycosSj6ha02xs5+Sv
  xJbkkDfrt/LVVgApBYlgJQG0WRcD/8+4cIyyAxGFp7MCQQDbdduyrvUTffsXeuad
  XcHIAmX928y19YGvCU3+TJtGIfUMPoRsnidMnZh2s29G6bGy0fkrmMadogEkKqQX
  AmYDAkBEmbdGx7hM0Oscpww7bonHMlrPNVy03nSC4LItR9nsRxdGor6ce2jDFpru
  MnfyY4AFCDtVVOwpqWPFBNYrcUtXAkEAltAme2OKHawMmnUl9+zPV1B2oH6k7kJZ
  rVy6kVA5wHdje9eWj0IcBaWjeacTiGreZ+Gt1sz1aKxFFoKLIxjN2wJADlpg/9iN
  Bf+JylK9QEgOTw6PngSOiXeaVXdErOPbu4WkzvxhB0bm8HPEPiJpLg/3sNaaX3ou
  TIEHO8o1EcEnrw==
  -----END PRIVATE KEY-----
  OpenSSL> 
  生成的文件:
  这里写图片描述
  屏幕快照 2016-05-11 10.38.17.png
  把公钥上传到支付宝,然后把pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt 这条命令产生的私钥用在下面设置中就好
  然后设置
  /*
       *商户的唯一的parnter和seller。
       *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
       */
      
      /*============================================================================*/
      /*=======================需要填写商户app申请的===================================*/
      /*============================================================================*/
      NSString *partner = PartnerID;//合作伙伴身份(PID):
      NSString *seller = SellerID;//商户支付宝账户
      //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
      NSString *privateKey = PartnerPrivKey;// 刚第三端命令生成的去头去尾
  如有问题,继续分享咯,总结才能让问题越来越少!



上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • 说你的好
    2018-5-07 10:17:50

    大神,这是什么测试?

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号