iOS微信开发(微信支付、他人代付、APP跳转微信公众号)

发表于:2018-3-22 10:49

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

 作者:littleBit    来源:51Testing软件测试网采编

  3、后台调用统一下单API向微信服务器发送请求生成预付单,并生成一个prepay_id返回给后台,后台再将prepay_id返回给客户端,成功生成订单信息
  成功生成订单
  生成订单相关代码
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  NSDictionary *signParaDic = @{@"schoolId":schoolId,
                                @"studentId":studentId,
                                @"parentId":parentId,
                                @"parentTel":phone,
                                @"totalFee":[NSString stringWithFormat:@"%i",payProduct.totalFee],
                                @"productId":[NSString stringWithFormat:@"%i",payProduct.productId],
                                @"productName":payProduct.productName};
  NSString *sign = [EncodeParameter md5:signParaDic];
  NSDictionary *parameters = @{@"schoolId":schoolId,
                               @"parentId":parentId,
                               @"studentId":studentId,
                               @"parentTel":phone,
                               @"totalFee":[NSString stringWithFormat:@"%i",payProduct.totalFee],
                               @"productId":[NSString stringWithFormat:@"%i",payProduct.productId],
                               @"productName":payProduct.productName,
                               @"sign":sign};
  NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:WechatPlaceOrderAPI parameters:parameters error:nil];
  _palceOrderOperation = [manager HTTPRequestOperationWithRequest:request  success:^(AFHTTPRequestOperation *operation, id responseObject) {
      //
      NSDictionary *resDic = (NSDictionary *)responseObject;
      NSNumber *code = [resDic objectForKey:@"result"];
      NSString *msg = [resDic objectForKey:@"message"];
      if ([code integerValue] == Success) {
          WeChatPreOrder *preOrder = [[WeChatPreOrder alloc] initWithDic:resDic];
          if (self.delegate && [self.delegate respondsToSelector:@selector(placeOrderSucess:preOder:)]) {
              [self.delegate placeOrderSucess:self preOder:preOrder];
          }
      } else if ([code integerValue] == 300) {
          if (self.delegate && [self.delegate respondsToSelector:@selector(placeOrderFailed:error:)]) {
              [self.delegate placeOrderFailed:self error:msg];
          }
      }else {
          if (self.delegate && [self.delegate respondsToSelector:@selector(placeOrderFailed:error:)]) {
              [self.delegate placeOrderFailed:self error:RequestError];
          }
      }
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      if (self.delegate && [self.delegate respondsToSelector:@selector(placeOrderFailed:error:)]) {
          [self.delegate placeOrderFailed:self error:RequestError];
      }
  }];
  4、APP调用SDK打开微信,进行支付
  微信客户端向微信服务器发起支付请求并返回支付结果(中间交互参数prepay_id,微信服务器要验证这个参数是否跟之前的prepay_id一致)
  微信支付
  调起微信支付相关代码
  PayReq* req             = [[PayReq alloc] init];
  req.partnerId           = weChatPreOrder.partnerId;
  req.prepayId            = weChatPreOrder.prepayId;
  req.nonceStr            = weChatPreOrder.noncestr;
  req.timeStamp           = [weChatPreOrder.timestamp intValue];
  req.package             = weChatPreOrder.package;
  req.sign                = weChatPreOrder.sign;
  [WXApi sendReq:req];
  5、用户输入支付密码后,微信客户端跟微信服务器交互,确认支付
  输入密码进行支付.png
  6、微信服务器将支付结果返回给微信客户端,并异步发送支付结果给我们后台
  客户端支付结果
  7、客户端可以调用后台查询支付订单接口,查询是否支付成功,并显示支付结果
  客户端支付结果
  查询订单相关代码
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  NSDictionary *signParaDic = @{@"schoolId":[BCHTTPRequest schoolId],@"parentId":[BCHTTPRequest getUserId]};
  NSString *sign = [EncodeParameter md5:signParaDic];
  NSDictionary *parameters = @{@"schoolId":[BCHTTPRequest schoolId],@"parentId":[BCHTTPRequest getUserId],@"sign":sign};
  NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:QueryOrderAPI parameters:parameters error:nil];
  _operation = [manager HTTPRequestOperationWithRequest:request  success:^(AFHTTPRequestOperation *operation, id responseObject) {
      //
      NSDictionary *resDic = (NSDictionary *)responseObject;
      NSNumber *code = [resDic objectForKey:@"result"];
      NSString *msg = [resDic objectForKey:@"message"];
      if ([code integerValue] == Success) {
          NSArray *order = [self orderArray:resDic];
          if (self.delegate && [self.delegate respondsToSelector:@selector(queryOrderSucess:orders:)]) {
              [self.delegate queryOrderSucess:self orders:order];
          }
      } else if ([code integerValue] == 300) {
          if (self.delegate && [self.delegate respondsToSelector:@selector(queryOrderFailed:error:)]) {
              [self.delegate queryOrderFailed:self error:msg];
          }
      }else {
          if (self.delegate && [self.delegate respondsToSelector:@selector(queryOrderFailed:error:)]) {
              [self.delegate queryOrderFailed:self error:RequestError];
          }
      }
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      if (self.delegate && [self.delegate respondsToSelector:@selector(queryOrderFailed:error:)]) {
          [self.delegate queryOrderFailed:self error:RequestError];
      }
  }];
  MD5签名相关代码
  + (NSString *)md5:(NSDictionary *)paraDic {
    // NOTE: 排序,得出最终请求字串
   NSArray* sortedKeyArray = [[paraDic allKeys] sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2];
   }];
    NSMutableArray *tmpArray = [NSMutableArray new];
    for (NSString* key in sortedKeyArray) {
        NSString* value = [paraDic objectForKey:key];
        if ([value isKindOfClass:[NSNumber class]]) {
            value = [(NSNumber *)value stringValue];
        }
        if (value.length > 0) {
            NSString *keyValueStr = [NSString stringWithFormat:@"%@=%@",key,value];
            [tmpArray addObject:keyValueStr];
        }
    }
    NSString *parameterStr = [tmpArray componentsJoinedByString:@"&"];
    NSString *res = [NSString stringWithFormat:@"%@&key=%@",parameterStr,Key];
    return [[BCBaseObject MD5Hash:res] uppercaseString];
  }


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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号