iOS微信支付便贵,按照官方文檔導(dǎo)入微信SDK。大致分為四步昂秃。
1禀梳、項(xiàng)目設(shè)置微信AppID杜窄,商戶在微信開(kāi)放平臺(tái)申請(qǐng)開(kāi)發(fā)APP應(yīng)用后,微信開(kāi)放平臺(tái)會(huì)生成APP的唯一標(biāo)識(shí)APPID算途。在Xcode中打開(kāi)項(xiàng)目塞耕,設(shè)置項(xiàng)目屬性中的URL Schemes為您的APPID。
image
image
2嘴瓤、商戶APP工程中引入微信lib庫(kù)和頭文件扫外,調(diào)用API前,需要先向微信注冊(cè)您的APPID廓脆,代碼如下:
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
3筛谚、調(diào)起支付,商戶服務(wù)器生成支付訂單停忿,先調(diào)用【統(tǒng)一下單API】生成預(yù)付單驾讲,獲取到prepay_id后將參數(shù)再次簽名傳輸給APP發(fā)起支付。從服務(wù)器請(qǐng)求加密后的字符串來(lái)調(diào)起微信客戶端席赂。
4吮铭、支付結(jié)果回調(diào),照微信SDK Sample颅停,在類實(shí)現(xiàn)onResp函數(shù)谓晌,支付完成后,微信APP會(huì)返回到商戶APP并回調(diào)onResp函數(shù)癞揉,開(kāi)發(fā)者需要在該函數(shù)中接收通知扎谎,判斷返回錯(cuò)誤碼,如果支付成功則去后臺(tái)查詢支付結(jié)果再展示用戶實(shí)際支付結(jié)果烧董。注意一定不能以客戶端返回作為用戶支付的結(jié)果毁靶,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)。
由于本身項(xiàng)目里面導(dǎo)入了友盟SDK6.1.0(里面包含了微信SDK)逊移,此時(shí)就不在重復(fù)導(dǎo)入微信SDK1.8.0,若沒(méi)有導(dǎo)入预吆,此時(shí)需要導(dǎo)入「烊可以通過(guò)cocoapods方式拐叉,可以手動(dòng)導(dǎo)入。
*在工程的Podfile里面添加以下代碼:
pod 'WechatOpenSDK'
保存并執(zhí)行pod install,然后用后綴為.xcworkspace的文件打開(kāi)工程扇商。
注意:
命令行下執(zhí)行pod search WechatOpenSDK,如顯示的WechatOpenSDK版本不是最新的凤瘦,則先執(zhí)行pod repo update操作更新本地repo的內(nèi)容
1、調(diào)起微信支付詳細(xì)代碼如下:
在AppDelegate中對(duì)微信key先進(jìn)行注冊(cè):[WXApi registerApp:appkey];
調(diào)起微信支付
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
delegate.AlipayResultCallback = handler;
NSDictionary *dict = @{};
//商城大訂單號(hào)
NSString *orderBigId = kCheckNil(jsDict[@"orderBigId"]);
//商城支付流水號(hào)
NSString *orderBizCode = kCheckNil(jsDict[@"orderBizCode"]);
//支付渠道
NSString *payWay = kCheckNil(jsDict[@"payWay"]);
// orderBigId = 20170927000000005201;
// orderBizCode = 20170927000000000200;
// payWay = alipay;
[[ShopManager sharedInstance] alipayOrderBigId:orderBigId inSerialNo:orderBizCode payWay:payWay
onComplete:^(BOOL isSuccessful, id result, NSString *error) {
if (isSuccessful)
{
NSDictionary *alipayDict = (NSDictionary *)result;
if (alipayDict)
{
//此時(shí)做個(gè)標(biāo)記:標(biāo)記是支付調(diào)起的支付寶或微信客戶端
[[NSUserDefaults standardUserDefaults] setObject:@"isActived" forKey:@"alipay"];
if (alipayDict[@"wrappedThreePartyReqBody"] && [payWay isEqualToString:@"alipay"])
{
[[AlipaySDK defaultService] payOrder:alipayDict[@"wrappedThreePartyReqBody"] fromScheme:@"xhscmall" callback:^(NSDictionary *resultDic){
XHLog(@"resultDic = %@",resultDic);
handler(YES,resultDic);
}];
}
else if (alipayDict[@"wrappedThreePartyReqBody"] && [payWay isEqualToString:@"wechatpay"])
{
//回調(diào)字典給H5,成功回調(diào)statusCode為9000案铺,失敗回調(diào)空字符串蔬芥。
[[PayServer sharedPayServer] wxPay:alipayDict[@"wrappedThreePartyReqBody"] withcomplete:^(PayType type, NSDictionary * _Nonnull message) {
if (type == PaySuccess) {
handler(YES,message);
}else if(type == PayCancle){
handler(NO,message);
}else if (type == PayFail){
handler(NO,message);
}
}];
}
}
}
else
{
handler(NO,dict);
}
}];
對(duì)后臺(tái)返回的json字符串進(jìn)行解析分解
if (![WXApi isWXAppInstalled]) {
complete(PayUnInstall, @{@"errorMsg":@"未安裝微信!"});
return;
}
//json字符串轉(zhuǎn)字典
if (payInfoString == nil) {
return;
}
NSData *jsonData = [payInfoString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *payInfo = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if(err)
{
NSLog(@"json解析失敗:%@",err);
return;
}
self.complete = complete;
self.uid = uid;
//組裝微信支付請(qǐng)求信息
PayReq* request = [[PayReq alloc] init];
request.partnerId = [NSString stringWithFormat:@"%@",[payInfo objectForKey:@"partnerid"]];
request.prepayId= [NSString stringWithFormat:@"%@",[payInfo objectForKey:@"prepayid"]];
request.package = [NSString stringWithFormat:@"%@",[payInfo objectForKey:@"packages"]];
request.nonceStr= [NSString stringWithFormat:@"%@",[payInfo objectForKey:@"noncestr"]];
//服務(wù)端此時(shí)返回的是毫秒級(jí),需要除以1000轉(zhuǎn)換成秒級(jí)笔诵。
NSMutableString *stamp = [payInfo objectForKey:@"timestamp"];
//轉(zhuǎn)換成UInt32
request.timeStamp = (UInt32)stamp.intValue;
request.sign= [NSString stringWithFormat:@"%@",[payInfo objectForKey:@"sign"]];
BOOL flag = [WXApi sendReq:request];
if (!flag) {
complete(PayFail, @{@"errorMsg":@"微信支付參數(shù)錯(cuò)誤!"});
}
else{
//請(qǐng)求成功
NSLog(@"微信支付請(qǐng)求成功");
}
-(void)onResp:(BaseResp *)resp{
if ([resp isKindOfClass:[PayResp class]]) {
PayResp *response = (PayResp *)resp;
PayType type = PaySuccess;
//先寫一個(gè)狀態(tài)碼為空字符串返吻,支付成功將字符串置為9000,支付失敗字符串繼續(xù)為空乎婿。
NSString *statusCode = @"";
switch (response.errCode) {
case WXSuccess: {
type = PaySuccess;
statusCode = @"9000";
break;
}
case WXErrCodeUserCancel: {
type = PayCancle;
break;
}
default: {
type = PayFail;
break;
}
}
if (self.complete) {
self.complete(type, @{@"errorMsg":response.description,@"resultStatus":statusCode});
}
}
}
此時(shí)有三種回調(diào)的同步支付結(jié)果:支付成功测僵,支付失敗,支付取消谢翎。
同步結(jié)果不能作為App支付的依據(jù)捍靠,還是要根據(jù)微信訂單號(hào)或者商戶訂單號(hào)去后臺(tái)查驗(yàn)支付結(jié)果作為最終的支付依據(jù)。