啥也不說(shuō)了茅逮,直接進(jìn)主題:
首先去這個(gè)網(wǎng)頁(yè) https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN 下載微信支付需要的SDK,倒入進(jìn)自己的工程中。
微信支付SDK.png
添加依賴庫(kù):
A9362E87-CD04-4DD0-9947-6D72A3F88662.png
修改兩配置:
3BE0696E-C53B-4BB0-ACC6-F594A0F49D23.png
5B7F4099-89C9-4EF1-85A0-BF836476F8C6.png
這里需要在info里面配置兩個(gè)東西宣渗,一個(gè)白名單一個(gè)就是http請(qǐng)求網(wǎng)絡(luò)允許
B9BBAEF1-5757-46EA-A813-8A24876C990F.png
OK胰挑,開(kāi)始敲代碼:
在AppDelegate.h里面:
8B83AD9F-5AD6-41BC-8D4A-2F82013FA6C2.png
在AppDelegate.m中寫(xiě)下面的代碼:
#import "AppDelegate.h"
#import "WXApiManager.h"
// 微信開(kāi)放平臺(tái)申請(qǐng)得到的 appid, 需要同時(shí)添加在 URL schema
NSString * const WXAppId = @"wxd930ea5d5a258f4f";
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[WXApi registerApp:WXAppId];
return YES;
}
#pragma mark - 微信支付回調(diào)
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
Demo整體這么多file注意對(duì)應(yīng):
4BAD73D2-194E-4260-A7AA-BF5150197A90.png
下面是WXApiManager.h
#import <Foundation/Foundation.h>
#import "WXApi.h"
@interface WXApiManager : NSObject<WXApiDelegate>
+ (instancetype)sharedManager;
@end
WXApiManager.m文件:
#import "WXApiManager.h"
@implementation WXApiManager
#pragma mark - 單例
+(instancetype)sharedManager {
static dispatch_once_t onceToken;
static WXApiManager *instance;
dispatch_once(&onceToken, ^{
instance = [[WXApiManager alloc] init];
});
return instance;
}
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp
{
if([resp isKindOfClass:[PayResp class]]){
//支付返回結(jié)果夕冲,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢
NSString *strMsg;
switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付結(jié)果:成功!";
NSLog(@"支付成功-PaySuccess语卤,retcode = %d", resp.errCode);
break;
default:
strMsg = [NSString stringWithFormat:@"支付結(jié)果:失敗!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"錯(cuò)誤粹舵,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
break;
}
}
}
@end
在ViewController.m文件中寫(xiě)上以下的代碼就搞定了:
#import "ViewController.h"
#import "WXApi.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// [self bizPay];
}
//模擬
- (IBAction)wxPayClick:(id)sender {
[self easyPay];
}
//模擬支付訂單
- (void)easyPay{
// NSDictionary *dict = @{@"appid":@"wx75b78ead0e64a547",@"attach":@"支付測(cè)試",@"body":@"APP支付測(cè)試",@"mch_id":@"10000100",@"nonce_str":@"1add1a30ac87aa2db72f57a2375d8fec",@"notify_url":@"http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php",@"out_trade_no":@"1415659990",@"spbill_create_ip":@"14.23.150.211",@"total_fee":@"0.1",@"trade_type":@"APP",@"sign":@"0CB01533B8C1EF103065174F50BCA001"};
// NSMutableString *stamp = [dict objectForKey:@"timestamp"];
//調(diào)起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = @"1900000109";
req.prepayId = @"WX1217752501201407033233368018";
req.nonceStr = @"5K8264ILTKCH16CQ2502SI8ZNMTM67VS";
req.timeStamp = 1412000000;
req.package = @"Sign=WXPay";
req.sign = @"9A0A8659F005D6984697E2CA0A9CF3B7";
[WXApi sendReq:req];
}
//真實(shí)生成訂單走這個(gè)方法
- (void)bizPay {
NSString *res = [self jumpToBizPay];
if( ![@"" isEqual:res] ){
UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"支付失敗" message:res delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alter show];
}
}
-(NSString *)jumpToBizPay {
//============================================================
// V3&V4支付流程實(shí)現(xiàn)
// 注意:參數(shù)配置請(qǐng)查看服務(wù)器端Demo
// 更新時(shí)間:2015年11月20日
//============================================================
NSString *urlString = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
//解析服務(wù)端返回json數(shù)據(jù)
NSError *error;
//加載一個(gè)NSURL對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
//將請(qǐng)求的url數(shù)據(jù)放到NSData對(duì)象中
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if ( response != nil) {
NSMutableDictionary *dict = NULL;
//IOS5自帶解析類NSJSONSerialization從response中解析出數(shù)據(jù)放到字典中
dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
NSLog(@"url:%@",urlString);
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.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=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
return @"";
}else{
return [dict objectForKey:@"retmsg"];
}
}else{
return @"服務(wù)器返回錯(cuò)誤钮孵,未獲取到j(luò)son對(duì)象";
}
}else{
return @"服務(wù)器返回錯(cuò)誤";
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
基本上到這里,你的應(yīng)用跳轉(zhuǎn)微信支付是沒(méi)有問(wèn)題的了眼滤,我們移動(dòng)端做的事情就這么多的巴席,剩下的拋給后臺(tái)弄吧,如果他不會(huì)诅需,就說(shuō)他菜漾唉,別傻傻的把支付生成訂單這么牛逼的事情放在我們移動(dòng)端,會(huì)出問(wèn)題的诱担。切記切記毡证!
GitHub下載地址