怎样关闭苹果微信支付服务器,iOS-微信支付功能实现

悠闲时光, 顺便将开发过程中, 经常使用到的一些功能, 记录分享出来,比如支付!

本想写一篇银联支付,不过看了之前转载过一篇关于银联支付的文章写得很详细,我就不再重复了, 有兴趣的童鞋可以去看一下; 戳这里

首先介绍一下微信支付的实现流程:

注册微信开放平台,创建应用获取appid,appSecret,申请支付功能(需要花费300大洋进行开发者资质认证),申请成功之后会返回一些参数.

下载微信支付sdk

客户端请求订单,后台与微信后台交互,返回给客户端支付参数

调用微信客户端,由微信客户端和微信服务器打交道;

客户端和服务端都会收到支付结果;(前台消息不可靠,我们需要去后台验证,如果后台没有收到支付通知,后台去微信服务器验证然后将结果返回给客户端)

开发步骤

在微信开放平台注册应用, 并开通支付功能之后(期间各种认证, 确认信息等操作按照流程走就可以, 在此省略)

第一步: 下载微信 SDK

b7f245daeff3

微信 SDK 下载

在这里下载微信 SDK

第二步: 集成 SDK

当下载 SDK 之后, 会看到其中有一个** read_me.txt ** 文件, 其实里面就是讲了最近几个版本的更新中解决的问题,以及使用该SDK的注意事项,所以这个 read_me 文件是很重要的。

b7f245daeff3

read_me

将 SDK 拖入工程

导入一下框架和链接库:

SystemConfiguration.framework,

libz.dylib, libsqlite3.0.dylib,

libc++.dylib, Security.framework,

CoreTelephony.framework,

CFNetwork.framework

b7f245daeff3

注: 如果是XCode 7之前,估计还需要手动导入Foundation.framework、UIKit.framework等框架;

将微信支付要用到的APPID设置为URL Schemes

b7f245daeff3

2B2A9042-0FDD-4C5B-AE88-20EEBE749F8A.png

第三步: 就是写代码了

注册APPID

商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:

#pragma mark 微信支付

- (void)wxPay {

/**

* 微信支付

* APPID:

*/

//向微信注册

BOOL isok = [WXApi registerApp:@"项目 APPID" withDescription:@"项目名称"];

if (isOk) {

TY_Log(@"注册微信成功");

}else{

TY_Log(@"注册微信失败");

}

}

调起支付

商户服务器生成支付订单,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:

现在我们只需要在控制器上添加一个button, 名字改成微信支付就可以了

button事件:

- (void)wxPayBtnClick:(UIButton *)sender {

if (![WXApi isWXAppInstalled]){ // 是否安装了微信

UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"没有安装微信" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

[alter show];

} else if (![WXApi isWXAppSupportApi]){ // 是否支持微信支付

UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"不支持微信支付" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

[alter show];

}else{ //已安装微信, 进行支付

[self WXPay];

}

}

#pragma mark 微信支付方法

- (void)WXPay{

//将微信支付所需参数信息,传给服务器

[BusinessEngine getWXPayParameteFlowCode:self.flowCode Body:self.storeName Price:self.orderValue Completion:^(NSDictionary *aDic) {

//需要创建这个支付对象

PayReq* req= [[PayReq alloc]init];

//由用户微信号和AppID组成的唯一标识,用于校验微信用户

//req.openID = [aDic objectForKey:@"appid"];

// 商家id,在注册的时候给的

req.partnerId = [aDic objectForKey:@"partnerid"];

// 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你

req.prepayId = [aDic objectForKey:@"prepayid"];

// 根据财付通文档填写的数据和签名

//这个比较特殊,是固定的,只能是即req.package = Sign=WXPay

req.package = @"Sign=WXPay";

// 随机编码,为了防止重复的,在后台生成

req.nonceStr = [aDic objectForKey:@"noncestr"];

// 这个是时间戳,也是在后台生成的,为了验证支付的

NSString * stamp = [aDic objectForKey:@"timestamp"];

req.timeStamp = stamp.intValue;

// 这个签名也是后台做的

req.sign = [aDic objectForKey:@"sign"];

//日志输出

//NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\nsign=%@",[aDic objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.sign );

//发送请求到微信,等待微信返回onResp

[WXApi sendReq:req];

}];

}

3 . 支付结果回调

按照微信SDKSample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。

注意:

一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。

这是最后一步了, 我们在支付页面支付完成以后呢要知道支付结果, 怎么做呢?

首先, 在 AppDelegate.m 里面实现该方法

#pragma mark 跳转支付宝, 微信 进行支付,处理支付结果

- (BOOL)application:(UIApplication *)application

openURL:(NSURL *)url

sourceApplication:(NSString *)sourceApplication

annotation:(id)annotation {

NSString *urlStr = [NSString stringWithFormat:@"%@",url];

if ([url.host isEqualToString:@"safepay"]) { //判断支付宝回调

//跳转支付宝钱包进行支付,处理支付结果

[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {

//TYLLog(@"result = %@",resultDic);

//TYLLog(@"result", resultDic)

}];

}else if ([sourceApplication isEqualToString:@"com.tencent.xin"] && [urlStr containsString:@"pay"]){ //判断微信回调

TY_Log(@"跳转微信支付处理支付方式结果");

return [WXApi handleOpenURL:url delegate:self];

}

return YES;

}

接下来我们需要遵守下协议

b7f245daeff3

#pragma mark 微信支付回调

-(void)onResp:(BaseResp*)resp{

//NSString * strMsg = [NSString stringWithFormat:@"errorCode: %d",resp.errCode];

//TY_Log(@"微信 = strMsg:", strMsg)

//NSString * errStr = [NSString stringWithFormat:@"errStr: %@",resp.errStr];

//TY_Log(@"微信 = errStr:", errStr)

NSString *strTitle;

if ([resp isKindOfClass:[SendMessageToWXResp class]]) {

strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];

}

NSString * wxPayResult;

if ([resp isKindOfClass:[PayResp class]]) {

strTitle = [NSString stringWithFormat:@"支付结果"];

switch (resp.errCode) {

case WXSuccess:

{

TYLLog(@"支付结果: 成功!");

wxPayResult = @"success";

}

break;

case WXErrCodeCommon:

{ //签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等

TYLLog(@"支付结果: 失败!");

wxPayResult = @"faile";

}

break;

case WXErrCodeUserCancel:

{ //

TYLLog(@"用户点击取消并返回");

wxPayResult = @"cancel";

}

break;

case WXErrCodeSentFail:

{ //发送失败

TYLLog(@"发送失败");

wxPayResult = @"faile";

}

break;

case WXErrCodeUnsupport:

{ //微信不支持

TYLLog(@"微信不支持");

wxPayResult = @"faile";

}

break;

case WXErrCodeAuthDeny:

{ //授权失败

TYLLog(@"授权失败");

wxPayResult = @"faile";

}

break;

default:

break;

}

//发出通知 从微信回调回来之后,发一个通知,让请求支付的页面接收消息,并且展示支付结果,或者进行一些自定义的展示或者跳转

NSNotification * notification = [NSNotification notificationWithName:@"WXPay" object:wxPayResult];

[[NSNotificationCenter defaultCenter] postNotification:notification];

//------------------------

}

}

其实移动端实现起来还是很简单的, 至于各种验证还是后台辛苦下了😂

如果这篇文章对您有些许帮助 请给我点个心吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值