• 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、常见问题及解决办法

  • 相关阅读:
    为https请求配置ssl(不用keystore,直接用证书,rsa私钥,java代码)
    http请求对于List类型参数的处理
    java中string转ByteBuffer
    lua for循环如何从第0位开始
    lua中的cjson简单使用
    mongodb返回方便读的数据
    markdown简单插入图片
    #问题#java报Annotation processing is not supported for module cycles
    #问题#java报can't create non-static inner class instance
    git commit+push的完整步骤
  • 原文地址:https://www.cnblogs.com/CH520/p/10801180.html
Copyright © 2020-2023  润新知