iOS开发_微信支付的介绍与实现

1、前期准备

    1. 微信开放平台注册账号
    • 需要登录邮箱验证
    • 填写您的商户信息
    1. 进入管理中心 --- 移动应用 --- 创建移动应用 --- 根据页面完善应用资料
    1. 审核过后,通过应用详情页面,查看应用详情,查看AppID和AppSecret相关信息
    1. 创建这些是没有支付能力的,需要额外申请,还是根据提示一步步填写,填写完之后会发一封邮件到您的预留的邮箱,然后到商户平台点击打开链接填写资料,最主要的是验证下开户收款账号,会收到一波几分钱的巨额财产,那么这个时候如果你填写的是你的开户账号,直接跑路吧,这些钱够你在深圳买房了。。。。。。如果你是个好人,那么找你们财务验证下是否有收到,就代表通过了,愉快的代码时间来了.

2、实现过程

  • 步骤1:
    • 用户在商户APP中选择商品,提交订单,选择微信支付。
  • 步骤2:
    • 商户后台收到用户支付单,调用微信支付统一下单接口
  • 步骤3:
    • 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
  • 步骤4:
  • 步骤5:
  • 步骤6:

3、代码部分

  • 代码地址
  • 3.1 工程配置

    • SDK接入
    • 依赖库导入
    • 配置下Scheme(这填写的是从微信申请回来的ID)
  • 3.2 代码实现

    • ①向微信注册你的AppID

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      
      	[self addAppKeyWindow];
      	// 注册APP,这里的字符串就是Wechat URL Scheme里面对应的ID 也是申请回来的ID,必须一致
      	[WXApi registerApp:@"wxb4ba3c02aa476ea1" enableMTA:NO];
      
      	return YES;
      }
      
    • ②请求服务器的参数,拉起微信支付App

      - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
      	[super touchesBegan:touches withEvent:event];
      
      	// 调起微信支付
      	PayReq *req = [[PayReq alloc] init];
      
      	req.partnerId = @"1900006771";
      	req.prepayId = @"wx14215832306243f22c2cb64d1193213932";
      	req.nonceStr = @"25e0c43f7a5a8f743bdb818a72799396";
      	req.timeStamp = 1579010312;
      	req.package = @"Sign=WXPay";
      	req.sign = @"2C1EEC439D493D7936F292AFDFFA244D";
      	[WXApi sendReq:req];
      }
      
      • 这里请求的方法和步骤就不写了,无非就是post信息给服务器,咱们看看需要的数据格式(假数据)
      • 以下数据是你自己商户后台请求处理返回的结果
      {
      	"appid" : "wxb4b",微信开放平台审核通过的AppID
      	"noncestr" : "171127dd056d05e423c8b9e",随机字符串
      	"package" : "Sign=WXPay", 固定值
      	"partnerid" : "130", 微信支付分配的商户ID
      	"prepayid" : "wx201609291601", 预支付交易会话ID
      	"sign" : "684371081C049B6017641", 签名,除了sign,剩下6个组合的再次签名字符串
      	"timestamp" : 147513 当前时间
      }
      
    • ③处理回调信息

      - (BOOL)application:(UIApplication *)application
      			openURL:(nonnull NSURL *)url
      			options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
      	return [WXApi handleOpenURL:url delegate:[CHWXApiManager sharedManager]];
      }
      
      • 这里的处理是根据微信官网提供的方法,代理到专门处理的单利当中去统一处理WXApiManager
      • 注意:这里的支付结果是支付完成时回调过来的,这是不准确的,是否支付成功要根据自己后台返回的结果。
      #import "CHWXApiManager.h"
      
      @implementation CHWXApiManager
      
      + (instancetype)sharedManager {
      	static dispatch_once_t onceToken;
      	static CHWXApiManager *instance;
      	dispatch_once(&onceToken, ^{
      		instance = [[CHWXApiManager alloc] init];
      	});
      	return instance;
      }
      
      #pragma mark - WXApiDelegate
      /*! @brief 发送一个sendReq后,收到微信的回应
      *
      * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
      * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
      * @param resp 具体的回应内容,是自动释放的
      */
      - (void)onResp:(BaseResp *)resp {
      	if([resp isKindOfClass:[PayResp class]]) {
      	// 支付返回结果,实际支付结果需要去微信服务器端查询
      	NSString *strMsg, *strTitle = [NSString stringWithFormat:@"支付结果"];
      
      	switch (resp.errCode) {
      		case WXSuccess:
      			strMsg = @"支付结果:成功!";
      			NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
      		break;
      
      		default:
      			strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
      			NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
      		break;
      		}
      		UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle
      		                                   	 			message:strMsg
      		                                   				delegate:self
      		                          				cancelButtonTitle:@"OK"
      		                          			otherButtonTitles:nil, nil];
      		[alert show];
      	}
      	else {
      	}
      }
      
      /*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果
      *
      * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。
      * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。
      * @param req 具体请求内容,是自动释放的
      */
      - (void)onReq:(BaseReq *)req {
      
      }
      
      @end
      

4、需要注意的问题

  • ①App Scheme一定要配置正确
  • ②千万不能用生成预订单返回的Sign,要重新生成(和后台沟通)
  • ③要考虑拉起App支付的时候自己程序被退出或者自杀了
  • ④一定不能用异步返回给App的参数进行判断成功与否,需要和后台进行二次确认,异步返回给后台的数据才是最终的

5、常见问题及解决办法

posted @ 2019-05-02 22:44  CH520  阅读(307)  评论(0编辑  收藏  举报