iOS開發(fā)---微信支付

在最前面闻鉴,還是先感謝開發(fā)過程中一下兩個帖子對自己的幫助茵乱,分享!C系骸瓶竭!

  1. 使用微信支付SDK1.5版本的支付demo
  2. 微信支付如果遇到跳轉(zhuǎn)只有一個確定請看這里

為了公司的安全,這個版本的微信信息我沒配置渠羞,不過斤贰,剛在網(wǎng)上找到個可以使用的,還是分享下次询,如下:

  1. 木有微信信息配置的demo
  2. 有微信信息配置的demo

1.向微信注冊你的應(yīng)用程序信息

我們的App由我們的項目經(jīng)理搞定荧恍,具體我也不清楚

官方接入指南如下:

請到 開發(fā)者應(yīng)用登記頁面 進行登記,登記并選擇移動應(yīng)用進行設(shè)置后渗蟹,將獲得AppID块饺,可立即用于開發(fā)赞辩。但應(yīng)用登記完成后還需要提交審核,只有審核通過的應(yīng)用才能正式發(fā)布使用授艰。

2.下載微信終端SDK文件辨嗽,項目中導(dǎo)入lib,SDKExport兩個文件

下載路徑(點iOS第二個)

下載iOS第二個

2.1導(dǎo)進去SDK后需要完善一些配置,要不會報錯

  1. 導(dǎo)入必要的庫
    導(dǎo)入必要類庫
  2. ARC和MRC配置淮腾,在后面添加-fno-objc-arc
    ARC和MRC配置
  3. bitCode和HTTPS配置糟需,iOS9后必須配置的
    bitCode和HTTPS配置指導(dǎo)

3.上代碼,勝過千言萬語

AppDelegate.m

#import "AppDelegate.h"
#import "ViewController.h"
#import "WXApi.h"
@interface AppDelegate ()<WXApiDelegate>

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    ViewController * vc = [[ViewController alloc]init];
    UINavigationController * nav = [[UINavigationController alloc]initWithRootViewController:vc];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];

    //向微信注冊
    [WXApi registerApp:@"谷朝。洲押。。圆凰。杈帐。。"];
    
    return YES;
}
#pragma mark 微信支付相關(guān)方法
-(void)onResp:(BaseResp *)resp{
    //如果第三方程序向微信發(fā)送了sendReq的請求专钉,那么onResp會被回調(diào)挑童。sendReq請求調(diào)用后,會切到微信終端程序界面
    NSString *strMsg=[NSString stringWithFormat:@"errcode:%d",resp.errCode];
    NSString *strTitle;
    if ([resp isKindOfClass:[PayResp class]]) {
        //支付返回結(jié)果跃须,實際支付結(jié)果需要去微信服務(wù)器端查詢
        strTitle=[NSString stringWithFormat:@"支付結(jié)果"];
        switch (resp.errCode) {
            case WXSuccess:
                strMsg=@"支付結(jié)果:成功站叼!";
                break;
                
            default:
                strMsg = [NSString stringWithFormat:@"支付結(jié)果:失敗菇民!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                break;
        }
    }
    //支付成功后回調(diào)
    // http://210.22.129.138:8080/link/public/notifywechatcallback
    
    //下邊先注釋掉尽楔,以后會用得上
    //    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    //    [alert show];
}
-(void)onReq:(BaseReq *)req{
    //onReq是微信終端向第三方程序發(fā)起請求,要求第三方程序響應(yīng)第练。第三方程序響應(yīng)完后必須調(diào)用sendRsp返回阔馋。在調(diào)用sendRsp返回時,會切回到微信終端程序界面
}

ViewController.h


#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic,assign) int totalPrice;

@property (nonatomic,strong) NSString * orderName;

@end


ViewController.m

#import "ViewController.h"
#import "payRequsestHandler.h"
#import "WXApi.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIButton * bt = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    bt.backgroundColor = [UIColor redColor];
    [bt addTarget:self action:@selector(ButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:bt];
    
    self.totalPrice = 1;
    self.orderName = @"請叫我雷鋒复旬,哈哈";
}
-(void)ButtonClicked{
    [self pay];
}
- (void)pay
{
    payRequsestHandler *req = [payRequsestHandler alloc];
    //初始化支付簽名對象
    [req init:APP_ID mch_id:MCH_ID];
    //設(shè)置密鑰
    [req setKey:PARTNER_ID];
    
    
    //獲取到實際調(diào)起微信支付的參數(shù)后垦缅,在app端調(diào)起支付
    int lastPrice=self.totalPrice*100;
    NSMutableDictionary *dict = [req sendPay_demo:self.orderName price:[NSString stringWithFormat:@"%d",lastPrice]];
    
    if(dict != nil){
        NSMutableString *retcode = [dict objectForKey:@"retcode"];
        if (retcode.intValue == 0){
            NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
            
            //調(diào)起微信支付
            PayReq* req             = [[PayReq alloc] init];
            req.openID              = [dict objectForKey:@"appid"];
            req.partnerId           = [dict objectForKey:@"partnerid"];
            req.prepayId            = [dict objectForKey:@"prepayid"];
            req.nonceStr            = [dict objectForKey:@"noncestr"];
            req.timeStamp           = stamp.intValue;
            req.package             = [dict objectForKey:@"package"];
            req.sign                = [dict objectForKey:@"sign"];
            [WXApi sendReq:req];
            //日志輸出
            NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",req.openID,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
        }else{
            NSLog(@"提示信息:=%@",[dict objectForKey:@"retmsg"]);
            //            [self alert:@"提示信息" msg:[dict objectForKey:@"retmsg"]];
        }
    }else{
        NSLog(@"提示信息:-%@",@"服務(wù)器返回錯誤,未獲取到j(luò)son對象");
        //        [self alert:@"提示信息" msg:@"服務(wù)器返回錯誤驹碍,未獲取到j(luò)son對象"];
        //        }
        //    }else{
        //        [self alert:@"提示信息" msg:@"服務(wù)器返回錯誤"];
    }
}

payRequsestHandler.h

配置相關(guān)信息

// 賬號帳戶資料
//更改商戶把相關(guān)參數(shù)后可測試

#define APP_ID          @"壁涎。。志秃。怔球。。浮还。"               //APPID
#define APP_SECRET      @"竟坛。。。担汤。涎跨。。" //appsecret
//商戶號崭歧,填寫商戶對應(yīng)參數(shù)
#define MCH_ID          @"隅很。。率碾。叔营。。所宰。"
//商戶API密鑰绒尊,填寫相應(yīng)參數(shù)
#define PARTNER_ID      @"。仔粥。婴谱。。件炉。勘究。"
//支付結(jié)果回調(diào)頁面
#define NOTIFY_URL      @"http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php"
//獲取服務(wù)器端支付數(shù)據(jù)地址(商戶自定義)
#define SP_URL          @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php"

修改下面的方法,后面有參數(shù)的一種是項目需要的

//簽名實例測試(demo中的)
- ( NSMutableDictionary *)sendPay_demo;

//簽名實例(實際需要的)
- ( NSMutableDictionary *)sendPay_demo:(NSString *)orderName price:(NSString *)price;

payRequsestHandler.m

- ( NSMutableDictionary *)sendPay_demo:(NSString *)orderName price:(NSString *)price{

    //訂單標題斟冕,展示給用戶
    NSString *order_name    = orderName;
    //訂單金額,單位(分)
    NSString *order_price   = price;//1分錢測試
    
    //================================
    //預(yù)付單參數(shù)訂單設(shè)置
    //================================
    srand( (unsigned)time(0) );
    NSString *noncestr  = [NSString stringWithFormat:@"%d", rand()];
    NSString *orderno   = [NSString stringWithFormat:@"%ld",time(0)];
    NSLog(@"%@",orderno);
    NSMutableDictionary *packageParams = [NSMutableDictionary dictionary];
    
    [packageParams setObject: appid             forKey:@"appid"];       //開放平臺appid
    [packageParams setObject: mchid             forKey:@"mch_id"];      //商戶號
    [packageParams setObject: @"APP-001"        forKey:@"device_info"]; //支付設(shè)備號或門店號
    [packageParams setObject: noncestr          forKey:@"nonce_str"];   //隨機串
    [packageParams setObject: @"APP"            forKey:@"trade_type"];  //支付類型,固定為APP
    [packageParams setObject: order_name        forKey:@"body"];        //訂單描述缅阳,展示給用戶
    [packageParams setObject: NOTIFY_URL        forKey:@"notify_url"];  //支付結(jié)果異步通知
    [packageParams setObject: orderno           forKey:@"out_trade_no"];//商戶訂單號
    [packageParams setObject: @"196.168.1.1"    forKey:@"spbill_create_ip"];//發(fā)器支付的機器ip
    [packageParams setObject: order_price       forKey:@"total_fee"];       //訂單金額磕蛇,單位為分
    
    //獲取prepayId(預(yù)支付交易會話標識)
    NSString *prePayid;
    prePayid            = [self sendPrepay:packageParams];
    
    if ( prePayid != nil) {
        //獲取到prepayid后進行第二次簽名
        
        NSString    *package, *time_stamp, *nonce_str;
        //設(shè)置支付參數(shù)
        time_t now;
        time(&now);
        time_stamp  = [NSString stringWithFormat:@"%ld", now];
        nonce_str   = [WXUtil md5:time_stamp];
        //重新按提交格式組包,微信客戶端暫只支持package=Sign=WXPay格式十办,須考慮升級后支持攜帶package具體參數(shù)的情況
        //package       = [NSString stringWithFormat:@"Sign=%@",package];
        package         = @"Sign=WXPay";
        //第二次簽名參數(shù)列表
        NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
        [signParams setObject: appid        forKey:@"appid"];
        [signParams setObject: nonce_str    forKey:@"noncestr"];
        [signParams setObject: package      forKey:@"package"];
        [signParams setObject: mchid        forKey:@"partnerid"];
        [signParams setObject: time_stamp   forKey:@"timestamp"];
        [signParams setObject: prePayid     forKey:@"prepayid"];
        //[signParams setObject: @"MD5"       forKey:@"signType"];
        //生成簽名
        NSString *sign  = [self createMd5Sign:signParams];
        
        //添加簽名
        [signParams setObject: sign         forKey:@"sign"];
        
        [debugInfo appendFormat:@"第二步簽名成功秀撇,sign=%@\n",sign];
        
        //返回參數(shù)列表
        return signParams;
        
    }else{
        [debugInfo appendFormat:@"獲取prepayid失敗向族!\n"];
    }
    return nil;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呵燕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子件相,更是在濱河造成了極大的恐慌再扭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夜矗,死亡現(xiàn)場離奇詭異泛范,居然都是意外死亡,警方通過查閱死者的電腦和手機紊撕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門罢荡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事区赵〔宴郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵笼才,是天一觀的道長漱受。 經(jīng)常有香客問我,道長患整,這世上最難降的妖魔是什么拜效? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮各谚,結(jié)果婚禮上紧憾,老公的妹妹穿的比我還像新娘。我一直安慰自己昌渤,他們只是感情好赴穗,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膀息,像睡著了一般般眉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潜支,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天甸赃,我揣著相機與錄音,去河邊找鬼冗酿。 笑死埠对,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裁替。 我是一名探鬼主播项玛,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弱判!你這毒婦竟也來了襟沮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤昌腰,失蹤者是張志新(化名)和其女友劉穎开伏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剥哑,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡硅则,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了株婴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎虫。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡暑认,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出大审,到底是詐尸還是另有隱情蘸际,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布徒扶,位于F島的核電站粮彤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姜骡。R本人自食惡果不足惜导坟,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望圈澈。 院中可真熱鬧惫周,春花似錦、人聲如沸康栈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啥么。三九已至登舞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悬荣,已是汗流浹背菠秒。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氯迂,地道東北人稽煤。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像囚戚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轧简,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1驰坊、準備工作 在開始使用微信支付之前,有一些東西是開發(fā)者必須要知道的哮独。打開鏈接【微信支付】APP支付開發(fā)者文檔然后...
    小道蕭兮閱讀 897評論 0 8
  • 先下載微信SDK拳芙,如果集成了友盟分享里的微信,那就不用下載,也不用配置環(huán)境皮璧,因為配置友盟分享的時候已經(jīng)把微信支付的...
    夜涼聽風(fēng)雨閱讀 5,916評論 1 16
  • 網(wǎng)上看了好多博客文章舟扎,與關(guān)于微信支付的我攏了攏主要的,可以看看這是導(dǎo)入的庫和配置的URLType 一悴务、首先在App...
    Courage_SC閱讀 1,009評論 0 6
  • 一睹限、微信集成 1譬猫、準備工作 ①、進入微信開放平臺羡疗,申請開發(fā)者賬號 ②染服、打開“管理中心”,“創(chuàng)建...
    EKven閱讀 646評論 0 1
  • 首先你需要申請微信支付叨恨,申請相關(guān)支付參考:申請資料填寫界面預(yù)覽 申請到微信支付相關(guān)以后柳刮,下面這些東西對我們很重要。...
    愛吃魚的小灰閱讀 3,039評論 5 6