微信支付原理及實現

原理圖:

屏幕快照 10.47.58.png

1.微信開放平臺賬號的注冊
微信開放平臺(微信支付需要付費的,注冊成功后使用的主要為AppKey/SecretKey,其中SecretKey交由后臺完成集成)
微信開放平臺是商戶APP接入微信支付開放接口的申請入口,通過此平臺可申請微信APP支付
平臺入口:http://open.weixin.qq.com
2.項目的修改與設置
1)首先應該下載SDK并導入項目(這里以友盟自帶微信支付說明,具體內容相似)
如果項目中使用了友盟社會化分享SDK,那么你將不需要重復導入SDK,友盟中已經集成了微信支付。具體SDK如下:
屏幕快照 10.53.41.png

如果你的項目沒有使用友盟,請到開放平臺下載最新的SDK,然后導入您的項目。具體的SDK如下:
屏幕快照 10.56.05.png

2)在添加完SDK后需要添加相應的庫以及文件
屏幕快照10.57.24.png

3)然后是添加對應的URL用于調起
屏幕快照10.59.14.png

4)添加白名單、關閉Bitcode(對于http/https適配iOS9.0自行修改)
屏幕快照11.00.47.png

3.SDK的注冊與回調
在完成了上面的操作之后,我們所導入的SDK就可以使用了,很簡單
1)首先我們要進行注冊
導入#import “WXApi.h”

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
// Override point for customization after application launch. 
ViewController *userGuideViewController = [[ViewController alloc] init]; 
self.window.rootViewController = userGuideViewController;
 [WXApi registerApp:@"這里添加APPKey"]; 
return YES;
}

2)接著我們要寫一個調起

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
 // 跳轉到URL scheme中配置的地址 //
NSLog(@"跳轉到URL scheme中配置的地址-->%@",url);
 return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
}

3)然后是回調

//支付成功時調用,回到第三方應用中
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
 // NSLog(@"****************url.host -- %@",url.host); 
if ([url.scheme isEqualToString:@"這里添加AppKey"]) { 
return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
 } 
return YES;}
- (void) onResp:(BaseResp*)resp{ 
NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
 NSString *strTitle = @"支付結果";
 if([resp isKindOfClass:[PayResp class]]){ 
switch (resp.errCode) { 
case WXSuccess:
 strMsg = @"支付結果:成功!"; 
break; 
case WXErrCodeUserCancel: 
strMsg = @"支付結果:用戶點擊取消!";
 break; 
case WXErrCodeSentFail: 
strMsg = @"支付結果:發(fā)送失敗!"; 
break; 
case WXErrCodeAuthDeny:
 strMsg = @"支付結果:授權失??!";
 break; 
default: strMsg = @"支付結果:微信不支持!";
 break;
 } 
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
 [alert show]; 
}
}

4.SDK的使用
1)最后是在項目中需要進行微信支付的地方使用支付(這是完成整個支付流程中最重要的一部分,也是最需要注意的地方)
首先要進行一次網絡請求,后臺接口,將你的商品信息發(fā)送到后臺,生成訂單后返回,返回信息中最少要包含六個參數,通過這些參數調起支付。
導入#import “WXApi.h”

//返回參數調起支付
PayReq* req = [[PayReq alloc] init]; 
NSMutableDictionary *dict=[result objectForKey:@"resultCode"]; 
req.openID = [dict objectForKey:@"appid"]; req.partnerId = [dict objectForKey:@"mch_id"];
 req.prepayId = [dict objectForKey:@"prepay_id"]; 
req.nonceStr = [self md5:time_stamp]; 
req.timeStamp = [time_stamp intValue];
 req.package = @"Sign=WXpay"; 
//簽名(這個簽名可以自己進行簽名,也可以后臺操作,由后臺返回) 
NSMutableDictionary *signParams=[[NSMutableDictionary alloc] init]; 
[signParams setObject: req.openID forKey:@"appid"]; 
[signParams setObject: req.nonceStr forKey:@"noncestr"]; 
[signParams setObject: req.package forKey:@"package"]; 
[signParams setObject: req.partnerId forKey:@"partnerid"]; 
[signParams setObject: time_stamp forKey:@"timestamp"]; 
[signParams setObject: req.prepayId forKey:@"prepayid"]; 
req.sign = [self createMd5Sign:signParams];
 //調起支付(**參數有一個錯誤,將不能完成調起**) 
[WXApi sendReq:req];
  1. 自行加密處理(這部分可以由后臺完成)
//微信支付加密
-(NSString *) md5:(NSString *)str{ 
const char *cStr = [str UTF8String]; 
unsigned char digest[CC_MD5_DIGEST_LENGTH]; 
CC_MD5( cStr, (unsigned int)strlen(cStr), digest ); 
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; 
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) 
[output appendFormat:@"%02X", digest[i]]; 
return output;
}
-(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:@""] && ![categoryId isEqualToString:@"sign"] && ![categoryId isEqualToString:@"key"] ) {
 [contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]]; 
} 
}
 //添加key字段 
[contentString appendFormat:@"key=%@", @"這里添加SecretKey"]; 
NSString *md5Sign =[WXUtil md5:contentString]; return md5Sign;}

5.常見異常Bug處理
1)常見問題為微信支付調起不成功,每次調起只能調起一個帶有返回確認按鈕的頁面。
原因:參數錯誤,特別注意參數(簽名),后臺返回的參數不正確。
解決方案:逐個校驗參數,簽名可以本地加密處理,不要依賴后臺的返回簽名,有的時候后臺返回的是不正確的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評論 25 709
  • 實現支付寶支付的準備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后,支付寶會提供一些必要的數據給我們 商戶...
    Anson楊春安閱讀 8,627評論 0 6
  • 冰床銀覃夢不成 碧天如水夜云輕 雁聲遠過瀟湘去 十二樓中月自明 床鋪冰冷,月光泠泠,為何連夢也不能入? 披衣起身,...
    未望人閱讀 272評論 0 0
  • 如果把過年(春節(jié))這個節(jié)日活生生地從一個中國人的生活中剝離出來,那么他一定是痛苦的,至少在歲末年初之時,他的這種痛...
    長安米貴V閱讀 198評論 0 0
  • 7月15日 接受人的差異性,知道他與你不一樣,世上沒有一樣的兩個人,一個人也不能控制另外一個人,有時候放手是成長最...
    happyMia閱讀 270評論 0 0

友情鏈接更多精彩內容