官方建議使用服務器簽名來接入微信支付,從安全上考慮,客戶端不應該知道RAS密鑰,也不需要每個客戶端都寫一遍簽名的算法。
前言
申請開通微信支付功能,需要認證開發者資質300/次,微信發郵件給API參數表。后面的代碼當中的APPID 為測試代碼的APPID.
參數
支付流程
- 導入支付SDK,注冊微信支付
- Info.plist中增加如下代碼
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
- 導入第三方框架和鏈接庫
Security.framework
CoreTelephony.framework
SystemConfiguration.framework
libc++.tbd
lib.tbd
libsqlite3.tbd
libWeChatSDK.a
-
APPID設置為URL Schemes
URL Schemes - 在AppDelegate中注冊
//注冊微信
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//向微信注冊wxd930ea5d5a258f4f
[WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];
return YES;
}
//設置代理
-(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]];
}
- 發起支付
-(IBAction)weixinPayAction:(UIButton *)sender {
//先判斷是否安裝微信或是否支持微信支付
if (![WXApi isWXAppInstalled])
return ;
if (![WXApi isWXAppSupportApi])
return ;
//向后臺請求數據
[self PayAction];
}
-(NSString*)PayAction{
NSString *urlString = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
//解析服務端返回json數據
NSError *error;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if ( response != nil) {
NSMutableDictionary *dict = NULL;
dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
if(dict != nil){
NSMutableString *retcode = [dict objectForKey:@"retcode"];
if (retcode.intValue == 0){
//調起微信支付
PayReq* req = [[PayReq alloc] init];
//微信號和AppID組成的唯一標識,發送請求時第三方程序必須填寫,
//用于校驗微信用戶是否換號登錄
req.openID = [dict objectForKey:@"openID"]; //商戶
req.partnerId = [dict objectForKey:@"partnerid"]; //商戶號ID
req.prepayId = [dict objectForKey:@"prepayid"];//預支付交易ID
req.nonceStr = [dict objectForKey:@"noncestr"]; //隨機字符串
req.timeStamp = [dict objectForKey:@"timestamp"].intValue;//時間戳
req.sign = [dict objectForKey:@"sign"]; //簽名
req.package = [dict objectForKey:@"package"];//擴展字段,固定值@“Sign=WXPay”
[WXApi sendReq:req];
return @"一切OK";
}else{
return [dict objectForKey:@"retmsg"];
}
}else{
return @"服務器返回錯誤,未獲取到json對象";
}
}else{
return @"服務器返回錯誤";
}
}
- 處理微信支付返回信息
- (void)onResp:(BaseResp *)resp {
if([resp isKindOfClass:[PayResp class]]){
//支付返回結果,實際支付結果需要去微信服務器端查詢
switch (resp.errCode) {
case WXSuccess:
NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
break;
default:
NSLog(@"錯誤,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
break;
}
}
}
商戶系統和微信支付系統主要交互說明:
步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。
步驟2:商戶后臺收到用戶支付單,調用微信支付****統一下單接口****。
步驟3:統一下單接口返回正常的prepay_id,再按簽名規范重新生成簽名后,將數據傳輸給APP。參與簽名的字段名為appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式為Sign=WXPay
步驟4:商戶APP調起微信支付。
步驟5:商戶后臺接收支付通知。