微信支付接入流程:
下載微信支付idk 地址: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN
將下載好的資源包放入工程
設置bit code 為NO
2644321-42c4d5bdf33db627.png
#import "WXApi.h"
//遵守協(xié)議
@interface AppDelegate ()<WXApiDelegate>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//微信支付注冊
[WXApi registerApp:@"你申請的微信appId"];
return YES;
}
//下面兩個方法已廢棄
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [WXApi handleOpenURL:url delegate:self];
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:self];
}
//注意要寫此方法检眯,否則支付結(jié)果不會回調(diào)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options
{
if ([url.host isEqualToString:@"safepay"]) {
return [WXApi handleOpenURL:url delegate:self];
}
//微信支付回調(diào)方法
- (void)onResp:(BaseResp *)resp
{
switch (resp.errCode) {
case WXSuccess:
{
//成功
}
break;
case WXErrCodeCommon:
{
//普通錯誤類型
}
break;
case WXErrCodeUserCancel:
{
//用戶點擊取消并返回
}
break;
case WXErrCodeSentFail:
{
//發(fā)送失敗
}
break;
case WXErrCodeAuthDeny:
{
//授權失敗
}
break;
case WXErrCodeUnsupport:
{
//微信不支持
}
break;
default:
break;
}
}
支付頁面導入頭文件
#import "WXApi.h"
- (void)pay{
//dic[@"sign"]是后臺統(tǒng)一下單返回的數(shù)據(jù)厘擂,前端調(diào)起支付需要后臺先在微信完成統(tǒng)一下單
NSDictionary *resultDic = dic[@"sign"];
NSDate* date = [NSDate dateWithTimeIntervalSinceNow:0];
int time_stamp=(int)[date timeIntervalSince1970];
//調(diào)起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = [resultDic objectForKey:@"mch_id"];
req.prepayId = [resultDic objectForKey:@"prepay_id"];
req.nonceStr = [resultDic objectForKey:@"nonce_str"];
req.timeStamp = time_stamp;
req.package = @"Sign=WXPay";
NSDictionary *parameters =@{@"appid":@"wxc896d9d1b6757532",@"partnerid":req.partnerId,@"prepayid":req.prepayId,@"package":@"Sign=WXPay",@"noncestr":req.nonceStr,@"timestamp":[[NSString alloc]initWithFormat:@"%d",time_stamp]};
NSMutableDictionary *mutableDic=[[NSMutableDictionary alloc]initWithDictionary:parameters];
req.sign=[self createMd5Sign:mutableDic];
//發(fā)起支付請求
[WXApi sendReq:req];
}
//微信支付創(chuàng)建package簽名
-(NSString *)createMd5Sign:(NSMutableDictionary*)dict
{
NSMutableString *contentString =[NSMutableString string];
NSArray *keys = [dict allKeys];
//按字母順序排序
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
//拼接字符串
for (NSString *categoryId in sortedArray) {
if ( ![[dict objectForKey:categoryId] isEqualToString:@""]
&& ![[dict objectForKey:categoryId] isEqualToString:@"sign"]
&& ![[dict objectForKey:categoryId] isEqualToString:@"key"]
){
[contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]];
}
}
//添加key字段
[contentString appendFormat:@"key=%@", @"你的秘鑰/我用的微信的secret字符串也是可以的,因為后臺在統(tǒng)一下單時用的這個锰瘸,所以這個地方和后臺保持一致就好"];
//得到MD5 sign簽名
NSString *md5Sign =[contentString md5];
return md5Sign;
}
//MD5加密
- (NSString *)md5
{
if(self == nil || [self length] == 0){
return nil;
}
const char *value = [self UTF8String];
unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(value, (CC_LONG)strlen(value), outputBuffer);
NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
[outputString appendFormat:@"%02x",outputBuffer[count]];
}
return outputString;
}
這樣支付就完成了刽严,如果不回調(diào)支付結(jié)果,檢查一下AppDelegate里面是不是寫錯了代理方法