iOS第三方支付-微信支付

原创 2015年11月20日 20:35:57

目前项目里有微信支付的需求,调研过一段时间后,发现其实并没有想象中的那么困难。如果你只是想实现该功能,一个方法足以,但是若你想深入了解实现原理。就需要花费更多的功夫了。目前我只清楚微信支付需要做签名,一种是在后台签名,一种是自己在前端签名。其实这对前端来说代码量并没有多大的改变,最大的区别是在后台签名逻辑更容易理解,而在前端签名逻辑有些混乱。

     现在,小编也只是知道怎么使用,而不得其精髓,现在我附上我的学习链接,为了避免以后链接出现不可用情况,请各位理解小编的粘贴复制。

    

   博客园(幻想无极) http://www.cnblogs.com/hxwj/p/4563351.html

  微信支付开发文档     http://mch.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1   

   

iOS第三方支付-微信支付

 

 

 

微信支付用到的文件

1.首先支持非arc 

 

 2.设置URL types

 

3.AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
    return YES;
}

 

 4.微信回调

//处理微信通过URL启动App时传递的数据

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    
    return [WXApi handleOpenURL:url delegate:self];
}

//微信回调
- (void)onResp:(BaseResp *)resp {
    //errCode
    switch (resp.errCode) {
        case WXSuccess:
            //成功回调
            break;
        default:
            break;
    }
}

 

 5.调用微信支付(主要代码,后台签名)

 
 //调起微信支付
            PayReq* req = [[PayReq alloc] init];
            req.openID      = APPI_ID;
            req.partnerId   = PARTNER_ID;
            req.prepayId    = prePayid;
            req.nonceStr    = nonce_str;
            req.timeStamp   = now;
            req.package     = package;
            req.sign        = sign;
            [WXApi safeSendReq:req];

 

 6.如果要在程序签名

 

​
//
//  ViewController.m
//  WxPay
//
//  Created by apple on 15/6/9.
//  Copyright (c) 2015年 tqh. All rights reserved.
//

#import "ViewController.h"
#import "payRequsestHandler.h"
#import "WXApi.h"

@interface ViewController () {
    enum WXScene _scene;
    NSString *Token;
    long token_time;
}

@end

@implementation ViewController

- (instancetype)init
{
    self = [super init];
    if (self) {
        _scene = WXSceneSession;
    }
    token_time = 0;
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    //向微信注册
    
    
    //微信支付
    UIButton *but2 = [[UIButton alloc]initWithFrame:CGRectMake(200, 100, 100, 40)];
    [but2 setTitle:@"微信支付" forState:UIControlStateNormal];
    but2.backgroundColor = [UIColor lightGrayColor];
    [but2 addTarget:self action:@selector(wxpay) forControlEvents:UIControlEventTouchUpInside];
    [but2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [self.view addSubview:but2];
    
}

//微信支付
- (void)wxpay
{
    //商户号
    NSString *PARTNER_ID    = @"1900000109";
    //商户密钥
    NSString *PARTNER_KEY   = @"8934e7d15453e97507ef794cf7b0519d";
    //APPID
    NSString *APPI_ID       = @"wxd930ea5d5a258f4f";
    //appsecret
    NSString *APP_SECRET    = @"db426a9829e4b49a0dcac7b4162da6b6";
    //支付密钥
    NSString *APP_KEY       = @"L8LrMqqeGRxST5reouB0K66CaYAWpqhAVsq7ggKkxHCOastWksvuX1uvmvQclxaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K";
    
    //支付结果回调页面
    NSString *NOTIFY_URL    = @"http://localhost/pay/wx/notify_url.asp";
    //订单标题
    NSString *ORDER_NAME    = @"Ios客户端签名支付 测试";
    //订单金额,单位(分)
    NSString *ORDER_PRICE   = @"1";
    
    //创建支付签名对象
    payRequsestHandler *req = [payRequsestHandler alloc];
    //初始化支付签名对象
    [req init:APPI_ID app_secret:APP_SECRET partner_key:PARTNER_KEY app_key:APP_KEY];
    
    //判断Token过期时间,10分钟内不重复获取,测试帐号多个使用,可能造成其他地方获取后不能用,需要即时获取
    time_t  now;
    time(&now);
    //if ( (now - token_time) > 0 )//非测试帐号调试请启用该条件判断
    {
        //获取Token
        Token                   = [req GetToken];
        //设置Token有效期为10分钟
        token_time              = now + 600;
        //日志输出
        NSLog(@"获取Token: %@\n",[req getDebugifo]);
    }
    if ( Token != nil){
        //================================
        //预付单参数订单设置
        //================================
        NSMutableDictionary *packageParams = [NSMutableDictionary dictionary];
        [packageParams setObject: @"WX"                                             forKey:@"bank_type"];
        [packageParams setObject: ORDER_NAME                                        forKey:@"body"];
        [packageParams setObject: @"1"                                              forKey:@"fee_type"];
        [packageParams setObject: @"UTF-8"                                          forKey:@"input_charset"];
        [packageParams setObject: NOTIFY_URL                                        forKey:@"notify_url"];
        [packageParams setObject: [NSString stringWithFormat:@"%ld",time(0)]        forKey:@"out_trade_no"];
        [packageParams setObject: PARTNER_ID                                        forKey:@"partner"];
        [packageParams setObject: @"196.168.1.1"                                    forKey:@"spbill_create_ip"];
        [packageParams setObject: ORDER_PRICE                                       forKey:@"total_fee"];
        
        NSString    *package, *time_stamp, *nonce_str, *traceid;
        //获取package包
        package        = [req genPackage:packageParams];
        
        //输出debug info
        NSString *debug     = [req getDebugifo];
        NSLog(@"gen package: %@\n",package);
        NSLog(@"生成package: %@\n",debug);
        
        //设置支付参数
        time_stamp  = [NSString stringWithFormat:@"%ld", now];
        nonce_str    = [TenpayUtil md5:time_stamp];
        traceid        = @"mytestid_001";
        NSMutableDictionary *prePayParams = [NSMutableDictionary dictionary];
        [prePayParams setObject: APPI_ID                                            forKey:@"appid"];
        [prePayParams setObject: APP_KEY                                            forKey:@"appkey"];
        [prePayParams setObject: nonce_str                                          forKey:@"noncestr"];
        [prePayParams setObject: package                                            forKey:@"package"];
        [prePayParams setObject: time_stamp                                         forKey:@"timestamp"];
        [prePayParams setObject: traceid                                            forKey:@"traceid"];
        
        //生成支付签名
        NSString    *sign;
        sign        = [req createSHA1Sign:prePayParams];
        //增加非参与签名的额外参数
        [prePayParams setObject: @"sha1"                                            forKey:@"sign_method"];
        [prePayParams setObject: sign                                               forKey:@"app_signature"];
        
        //获取prepayId
        NSString *prePayid;
        prePayid            = [req sendPrepay:prePayParams];
        //输出debug info
        debug               = [req getDebugifo];
        NSLog(@"提交预付单: %@\n",debug);
        
        if ( prePayid != nil) {
            //重新按提交格式组包,微信客户端5.0.3以前版本只支持package=Sign=***格式,须考虑升级后支持携带package具体参数的情况
            //package       = [NSString stringWithFormat:@"Sign=%@",package];
            package         = @"Sign=WXPay";
            //签名参数列表
            NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
            [signParams setObject: APPI_ID                                          forKey:@"appid"];
            [signParams setObject: APP_KEY                                          forKey:@"appkey"];
            [signParams setObject: nonce_str                                        forKey:@"noncestr"];
            [signParams setObject: package                                          forKey:@"package"];
            [signParams setObject: PARTNER_ID                                       forKey:@"partnerid"];
            [signParams setObject: time_stamp                                       forKey:@"timestamp"];
            [signParams setObject: prePayid                                         forKey:@"prepayid"];
            
            //生成签名
            sign        = [req createSHA1Sign:signParams];
            
            //输出debug info
            debug     = [req getDebugifo];
            NSLog(@"调起支付签名: %@\n",debug);
            
            //调起微信支付
            PayReq* req = [[PayReq alloc] init];
            req.openID      = APPI_ID;
            req.partnerId   = PARTNER_ID;
            req.prepayId    = prePayid;
            req.nonceStr    = nonce_str;
            req.timeStamp   = now;
            req.package     = package;
            req.sign        = sign;
            [WXApi safeSendReq:req];
        }else{
            /*long errcode = [req getLasterrCode];
             if ( errcode == 40001 )
             {//Token实效,重新获取
             Token                   = [req GetToken];
             token_time              = now + 600;
             NSLog(@"获取Token: %@\n",[req getDebugifo]);
             };*/
            NSLog(@"获取prepayid失败\n");
            [self alert:@"提示信息" msg:debug];
        }
    }else{
        NSLog(@"获取Token失败\n");
        [self alert:@"提示信息" msg:@"获取Token失败"];
    }
    
}

//客户端提示信息
- (void)alert:(NSString *)title msg:(NSString *)msg
{
    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    
    [alter show];
}

//- (void)onReq:(BaseReq *)req {
//    NSLog(@"qwe123");
//}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 

 DEMO下载地址:http://pan.baidu.com/s/1jGjCaJc

 补:有些童鞋出现跳到微信支付又跳回来的情况一般是你集成了第三方分享功能需要进行一下判断

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

 

 上面方法里面进行是不是微信支付的判断

 if ([url.host isEqualToString:@"pay"]) {
        [WXApi handleOpenURL:url delegate:self];
    }
    
    return YES;
版权声明:VIC

iOS/Android开发支付SDK列表

支付宝 进入官网 支付宝是一个开放式的支付平台,为各类交易场景提供支付工具的支持,并致力于为广大用户提供安全快速的电子支付、网上支付、安全支付、手机支付体验,及转账收款、水电煤缴费、信用卡...
  • bluewindaa
  • bluewindaa
  • 2015年01月28日 17:48
  • 1106

iOS第三方支付(支付宝SDK)

http://blog.csdn.net/xu_code/article/details/22172441 现在不少app内都集成了支付宝功能,因此对于iOS开发人员来说,也应该熟悉...
  • yuliblossom
  • yuliblossom
  • 2015年01月06日 16:25
  • 636

iOS第三方支付(支付宝SDK)

现在不少app内都集成了支付宝功能,因此对于iOS开发人员来说,也应该熟悉第三方支付 关于安全支付的流程,支付宝的文档里有个很好的图 数据流程 使用支付宝...
  • xumingjie1
  • xumingjie1
  • 2014年03月26日 14:26
  • 11740

ios第三方支付流程

现在不少app内都集成了支付宝功能,因此对于iOS开发人员来说,也应该熟悉第三方支付 关于安全支付的流程,支付宝的文档里有个很好的图 数据流程 ...
  • JianglongHuang
  • JianglongHuang
  • 2015年05月08日 11:55
  • 2283

Android开发第三方支付微信支付实例集成过程介绍

最近开发的项目需要集成第三方微信支付,于是查看了微信开放平台的开发指南顺利完成,下面为大家分享一下。 一、在集成之前先到微信开放平台拿到以下三个参数: 项目APP ID, 商户平台的商户号MCH_ID...
  • xuchao_blog
  • xuchao_blog
  • 2017年02月27日 16:36
  • 2210

关于ios是否可接入第三方支付

关于支付接入的原则,在网上搜集了看法。 从原则上来将,交易的是非虚拟商品就可以使用如微信,支付宝支付等方案,例如像淘宝,饿了吗等软件交易的是实际商品,所以无需使用内购。但虚拟商品,如购买会员...
  • book_1992
  • book_1992
  • 2018年01月08日 17:27
  • 71

iOS开发之第三方支付支付宝支付教程,史上最新最全第三方支付宝支付方式实现、支付宝集成教程,支付宝实现流程

本章项目demo: https://github.com/zhonggaorong/alipayDemo 支付宝支付大致流程为 : 1. 公司与支付宝进行签约 , 获得商户ID(partner)和...
  • chenyxh2005
  • chenyxh2005
  • 2017年01月11日 20:19
  • 4978

ios开发——支付宝SDK集成流程

1、创建应用 这个其实开发者们都应该懂,就是在支付宝这里挂个号,然后进行下一步业务的申请。 创建应用的链接 创建应用界面 开发者只需要按照指示一步一步添加内容就可以。 2、申请移...
  • caizhongtao
  • caizhongtao
  • 2017年02月08日 15:03
  • 3566

iOS集成微信支付的一些坑:onResp不回调、只显示一个确定按钮、闪回

iOS集成微信支付总体来说还是比较容易的(如果没有那些坑的话),关于:发起支付之后只显示一个确定按钮,没有任何错误提示,断点返回的Url Schemes,也只有一个ret=-2,官方文档解释为: “...
  • cuibo1123
  • cuibo1123
  • 2016年03月03日 18:36
  • 7823

接入第三方现在支付之微信支付所踩坑记

从来没有接入如此让人头疼的第三方支付!当初在接的时候,网上也没有资料可以查找!所有记录一番首先要吐槽的是:其demo是不能成功支付的 首先需要找公司或者现在支付公司拿到appID和key值第二个:是...
  • willba
  • willba
  • 2017年12月03日 20:24
  • 1099
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS第三方支付-微信支付
举报原因:
原因补充:

(最多只允许输入30个字)