iOS開發---微信支付

在最前面,還是先感謝開發過程中一下兩個帖子對自己的幫助,分享?。?!

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

為了公司的安全,這個版本的微信信息我沒配置,不過,剛在網上找到個可以使用的,還是分享下,如下:

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

1.向微信注冊你的應用程序信息

我們的App由我們的項目經理搞定,具體我也不清楚

官方接入指南如下:

請到 開發者應用登記頁面 進行登記,登記并選擇移動應用進行設置后,將獲得AppID,可立即用于開發。但應用登記完成后還需要提交審核,只有審核通過的應用才能正式發布使用。

2.下載微信終端SDK文件,項目中導入lib,SDKExport兩個文件

下載路徑(點iOS第二個)

下載iOS第二個

2.1導進去SDK后需要完善一些配置,要不會報錯

  1. 導入必要的庫
    導入必要類庫
  2. ARC和MRC配置,在后面添加-fno-objc-arc
    ARC和MRC配置
  3. bitCode和HTTPS配置,iOS9后必須配置的
    bitCode和HTTPS配置指導

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 微信支付相關方法
-(void)onResp:(BaseResp *)resp{
    //如果第三方程序向微信發送了sendReq的請求,那么onResp會被回調。sendReq請求調用后,會切到微信終端程序界面
    NSString *strMsg=[NSString stringWithFormat:@"errcode:%d",resp.errCode];
    NSString *strTitle;
    if ([resp isKindOfClass:[PayResp class]]) {
        //支付返回結果,實際支付結果需要去微信服務器端查詢
        strTitle=[NSString stringWithFormat:@"支付結果"];
        switch (resp.errCode) {
            case WXSuccess:
                strMsg=@"支付結果:成功!";
                break;
                
            default:
                strMsg = [NSString stringWithFormat:@"支付結果:失敗!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                break;
        }
    }
    //支付成功后回調
    // 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是微信終端向第三方程序發起請求,要求第三方程序響應。第三方程序響應完后必須調用sendRsp返回。在調用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];
    //設置密鑰
    [req setKey:PARTNER_ID];
    
    
    //獲取到實際調起微信支付的參數后,在app端調起支付
    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"];
            
            //調起微信支付
            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(@"提示信息:-%@",@"服務器返回錯誤,未獲取到json對象");
        //        [self alert:@"提示信息" msg:@"服務器返回錯誤,未獲取到json對象"];
        //        }
        //    }else{
        //        [self alert:@"提示信息" msg:@"服務器返回錯誤"];
    }
}

payRequsestHandler.h

配置相關信息

// 賬號帳戶資料
//更改商戶把相關參數后可測試

#define APP_ID          @"。。。。。。"               //APPID
#define APP_SECRET      @"。。。。。。" //appsecret
//商戶號,填寫商戶對應參數
#define MCH_ID          @"。。。。。。"
//商戶API密鑰,填寫相應參數
#define PARTNER_ID      @"。。。。。。"
//支付結果回調頁面
#define NOTIFY_URL      @"http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php"
//獲取服務器端支付數據地址(商戶自定義)
#define SP_URL          @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php"

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

//簽名實例測試(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分錢測試
    
    //================================
    //預付單參數訂單設置
    //================================
    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"]; //支付設備號或門店號
    [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"];  //支付結果異步通知
    [packageParams setObject: orderno           forKey:@"out_trade_no"];//商戶訂單號
    [packageParams setObject: @"196.168.1.1"    forKey:@"spbill_create_ip"];//發器支付的機器ip
    [packageParams setObject: order_price       forKey:@"total_fee"];       //訂單金額,單位為分
    
    //獲取prepayId(預支付交易會話標識)
    NSString *prePayid;
    prePayid            = [self sendPrepay:packageParams];
    
    if ( prePayid != nil) {
        //獲取到prepayid后進行第二次簽名
        
        NSString    *package, *time_stamp, *nonce_str;
        //設置支付參數
        time_t now;
        time(&now);
        time_stamp  = [NSString stringWithFormat:@"%ld", now];
        nonce_str   = [WXUtil md5:time_stamp];
        //重新按提交格式組包,微信客戶端暫只支持package=Sign=WXPay格式,須考慮升級后支持攜帶package具體參數的情況
        //package       = [NSString stringWithFormat:@"Sign=%@",package];
        package         = @"Sign=WXPay";
        //第二次簽名參數列表
        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];
        
        //返回參數列表
        return signParams;
        
    }else{
        [debugInfo appendFormat:@"獲取prepayid失??!\n"];
    }
    return nil;
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容

  • 1、準備工作 在開始使用微信支付之前,有一些東西是開發者必須要知道的。打開鏈接【微信支付】APP支付開發者文檔然后...
    小道蕭兮閱讀 914評論 0 8
  • 先下載微信SDK,如果集成了友盟分享里的微信,那就不用下載,也不用配置環境,因為配置友盟分享的時候已經把微信支付的...
    夜涼聽風雨閱讀 5,932評論 1 16
  • 網上看了好多博客文章,與關于微信支付的我攏了攏主要的,可以看看這是導入的庫和配置的URLType 一、首先在App...
    Courage_SC閱讀 1,018評論 0 6
  • 一、微信集成 1、準備工作 ①、進入微信開放平臺,申請開發者賬號 ②、打開“管理中心”,“創建...
    EKven閱讀 668評論 0 1
  • 首先你需要申請微信支付,申請相關支付參考:申請資料填寫界面預覽 申請到微信支付相關以后,下面這些東西對我們很重要。...
    愛吃魚的小灰閱讀 3,052評論 5 6