iOS第三方支付集成-微信支付

序言:说来惭愧,终于有支付的需求给我做了。。。哇嘎嘎,开动。。。文章尽量写的详细点,从自身出发,希望能给大家一点帮助。欢迎大佬指正。
支付流程:
这里写图片描述
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。
注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。
步骤5:商户后台接收支付通知。
步骤6:商户后台查询支付结果。

一 下载微信支付Demo学习观摩

传送门
工欲善其事必先利其器,先看下demo总不是坏处,也可以学习一下腾讯大佬编码风格。总的来说,微信支付demo还是不难的。

二 正式接入准备工作

1.把demo里面的sdk导入到项目中
这里写图片描述
2.Command+B编译,如果报错,加入以下文件
这里写图片描述
3.Project-Info中,添加微信的AppKey
这里写图片描述
4.设置微信白名单
这里写图片描述

三 正式接入

1.AppDelegate设置
这里写图片描述
这里写图片描述
这里写图片描述
6.代码都在PayManager里面
PayManager.h

//
//  PayManager.h
//  CarServiceDemo
//
//  Created by superButton on 2018/9/5.
//  Copyright © 2018年 com.from. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "WXApi.h"

@protocol PayManagerDelegate <NSObject>

@optional

@end

@interface PayManager : NSObject<WXApiDelegate>

/**
 代理
 */
@property (nonatomic, assign) id<PayManagerDelegate> delegate;

/**
 单例

 @return 单例
 */
+ (instancetype)sharedManager;

/**
 微信支付

 @param orderID 订单ID
 @param success 成功回调
 @param fail 失败回调
 */
- (void)payWithWeChatMethod:(NSString*)orderID successBlock:(GetBackBoolBlock)success failBlock:(GetBackBoolBlock)fail;

/**
 支付宝支付

 @param orderID 订单ID
 @param success 成功回调
 @param fail 失败回调
 */
- (void)payWithZhifubaoMethod:(NSString*)orderID successBlock:(GetBackBoolBlock)success failBlock:(GetBackBoolBlock)fail;

@end

PayManager.m

//
//  PayManager.m
//  CarServiceDemo
//
//  Created by superButton on 2018/9/5.
//  Copyright © 2018年 com.from. All rights reserved.
//

#import "PayManager.h"

@interface PayManager ()

@property (copy,nonatomic) GetBackBoolBlock successBlock;
@property (copy,nonatomic) GetBackBoolBlock failBlock;

@end

@implementation PayManager

+(instancetype)sharedManager {
    static dispatch_once_t onceToken;
    static PayManager *instance;
    dispatch_once(&onceToken, ^{
        instance = [[PayManager alloc] init];
    });
    return instance;
}

#pragma mark - 微信支付
- (void)payWithWeChatMethod:(NSString*)orderID successBlock:(GetBackBoolBlock)success failBlock:(GetBackBoolBlock)fail{

    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@""] = orderID;

    kWeakSelf(weakSelf)
    [[NetWorkingUtil netWorkingUtil] postDataWithPath:@"" parameters:params result:^(id obj, int status, NSString *msg) {

        if (status == 1) {

            weakSelf.successBlock = success;
            weakSelf.failBlock = fail;

            if(obj != nil){
                NSMutableString *retcode = [obj objectForKey:@"retcode"];
                if (retcode.intValue == 0){
                    NSMutableString *stamp  = [obj objectForKey:@"timestamp"];

                    //调起微信支付,参数后台返回就行
                    PayReq* req             = [[PayReq alloc] init];
                    req.openID              = kWeXinKeyID;
                    req.partnerId           = [obj objectForKey:@"partnerid"];
                    req.prepayId            = [obj objectForKey:@"prepayid"];
                    req.nonceStr            = [obj objectForKey:@"noncestr"];
                    req.timeStamp           = stamp.intValue;
                    req.package             = [obj objectForKey:@"package"];
                    req.sign                = [obj objectForKey:@"sign"];

                    if (![WXApi sendReq:req]) {
                        //微信调起支付失败
                        weakSelf.failBlock(NO);
                    }
                    //日志输出
                    NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[obj objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
                }
            }else{
                fail(NO);
            }
        }else{
            fail(NO);
        }

    }];
}

#pragma mark - 支付宝支付
- (void)payWithZhifubaoMethod:(NSString*)orderID successBlock:(GetBackBoolBlock)success failBlock:(GetBackBoolBlock)fail{

}

#pragma mark - WXApiDelegate
//收到微信回调
- (void)onResp:(BaseResp *)resp {
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回结果,实际支付结果需要去微信服务器端查询
        NSString *strMsg = [NSString stringWithFormat:@"支付结果"];

        switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付结果:成功!";
                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                [MBProgressHUD showSuccessOnView:kMAIN_WINDOW withMessage:strMsg];
                _successBlock(YES);
                break;

            default:
                strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                [MBProgressHUD showErrorOnView:kMAIN_WINDOW withMessage:strMsg];
                _failBlock(NO);
                break;
        }
    }else {
    }
}

///给微信发回调
- (void)onReq:(BaseReq *)req {

}

@end

四 注意

剩下的就是对接了,这个视情况而定。后面还有篇文章,我会集合所有支付可能遇到的坑和解决方案。传送门

高级iOS开发交流群:855808379
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xj_love/article/details/82531672
今日推荐