1. 支付功能
第一步:配置一些基本設置
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//設置微信的appKey和appSecret
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:KWechatKey appSecret:KWechatAppSecret redirectURL:@"http://mobile.umeng.com/social"];
}
第二步:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
//跳轉支付寶錢包進行支付,處理支付結果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
NSString *dic = [resultDic objectForKey:@"result"];
NSData *jsonData = [dic dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:nil];
int staute = [resultDic intValueForKey:@"resultStatus"];
switch (staute) {
case 9000:
[self requsetPay:[jsonDic objectForKey:@"sign"]];
break;
case 8000:
SHOW_MESSAGE_VIEW(nil, @"正在處理中", @"確定", nil);
break;
case 4000:
SHOW_MESSAGE_VIEW(nil, @"訂單支付失敗", @"確定", nil);
break;
case 6001:
SHOW_MESSAGE_VIEW(nil, @"用戶中途取消", @"確定", nil);
break;
case 6002:
SHOW_MESSAGE_VIEW(nil, @"網絡連接出錯", @"確定", nil);
break;
default:
break;
}
}];
} else if([[url absoluteString] hasPrefix:@"wx"]) {
return [WXApi handleOpenURL:url delegate:self];
}
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
if ([[url absoluteString] hasPrefix:@"tencent"]) {
return [TencentOAuth HandleOpenURL:url];
}else if([[url absoluteString] hasPrefix:@"wb"]) {
return [WeiboSDK handleOpenURL:url delegate:self];
}else if([[url absoluteString] hasPrefix:@"wx"]){
return [WXApi handleOpenURL:url delegate:self];
}
}
第三步:
-(void)onResp:(BaseResp*)resp{
if([resp isKindOfClass:[PayResp class]])
{
//支付返回結果,實際支付結果需要去微信服務器端查詢
PayResp * payResult = (PayResp *)resp;
[[NSNotificationCenter defaultCenter] postNotificationName:WXPAY_NOTIFICATION object:self userInfo:[NSDictionary dictionaryWithObject:payResult forKey:@"wxPayReturn"]];
}
}
第四步:
在支付頁面中,添加通知喔~~
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(weixinPayReturn:) name:WXPAY_NOTIFICATION object:nil];
//微信支付后的返回
-(void)weixinPayReturn:(NSNotification *)info
{
PayResp * result = [info.userInfo objectForKey:@"wxPayReturn"];
switch (result.errCode) {
case WXSuccess:
[self performSelector:@selector(checkThePayResult) withObject:self afterDelay:1.0];
[self showMyMessage:@"支付結果:成功!"];
break;
default:
[self showMyMessage: [NSString stringWithFormat:@"支付結果:失敗"]];
NSLog(@"錯誤,retcode = %d, retstr = %@", result.errCode,result.errStr);
break;
}
}
-(void)checkThePayResult{
//處理服務器的請求了(一般是支付成功后的回調接口)
[self requsetPay:@""];
}
第五步:很重要的 (點擊支付按鈕的事件)
-(void)payMethodWithUserPay;
{
NSString *url;
if (style ==1) {
url = [NSString stringWithFormat:@"%@Pay/Wxpay?order_number=%@&user_id=%@&token=%@",HaoSe_URL,self.model.order_number,USERID,TOKEN];
}else{
url = [NSString stringWithFormat:@"%@Pay/getSignStr?order_number=%@&user_id=%@&token=%@",HaoSe_URL,self.model.order_number,USERID,TOKEN];
}
[commonSet post:url params:nil success:^(id json) {
NSDictionary *result = json;
if (style ==1) {
//調起微信支付
NSDictionary *dic = [result objectForKey:@"data"];
WXPayData* req = [[WXPayData alloc] init];
req.openID = [dic stringForKey:@"appId"];
req.partnerId = [dic stringForKey:@"partnerid"];//商戶ID
req.prepayId = [dic stringForKey:@"prepayid"];
req.nonceStr = [dic stringForKey:@"noncestr"];
req.timeStamp = [dic intValueForKey:@"timestamp"];
req.package = @"Sign=WXPay";
// req.spKey = [result stringForKey:@"key"];
// req.tradeNo = [result stringForKey:@"tradeNo"];
//生成簽名
// NSString *sign = [GlobalTools createMd5Sign:req];
NSString *sign = [dic stringForKey:@"sign"];
req.sign = sign;
// _tradeNo = req.tradeNo;
PayReq* payData = [[PayReq alloc] init];
payData = req;
if ([WXApi sendReq:payData])
{
NSLog(@"微信支付發送成功");
}else
{
NSLog(@"微信支付發送失敗");
}
}else{
NSString *params = [[result objectForKey:@"data"]objectForKey:@"params"];
// Order *zhifuOrder = [[Order alloc] initWithDictionary:params];
// zhifuOrder.privateKey = [[result objectForKey:@"data"] objectForKey:@"key"];
// NSString *orderSpec = [zhifuOrder description];
//
NSString *key = [[result objectForKey:@"data"]objectForKey:@"key"];
//獲取私鑰并將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(key);
NSString *signedString = [signer signString:params];
NSString *appScheme = @"alisdkdemo";
//將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
NSString *orderString = nil;
if (key != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
params, signedString, @"RSA"];
[[NSUserDefaults standardUserDefaults]setObject:_model.order_number forKey:@"order"];
//調支付寶
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
int staute = [resultDic intValueForKey:@"resultStatus"];
NSString *dic = [resultDic objectForKey:@"result"];
switch (staute) {
case 9000:
[self requsetPay:dic];
break;
case 8000:
SHOW_MESSAGE_VIEW(nil, @"正在處理中", @"確定", nil);
break;
case 4000:
SHOW_MESSAGE_VIEW(nil, @"訂單支付失敗", @"確定", nil);
break;
case 6001:
SHOW_MESSAGE_VIEW(nil, @"用戶中途取消", @"確定", nil);
break;
case 6002:
SHOW_MESSAGE_VIEW(nil, @"網絡連接出錯", @"確定", nil);
break;
default:
break;
}
}];
}
}
} failure:^(NSError *error) {
}];
}