支付宝
首先支付宝和微信支付不难,支付宝和微信的集成主要工作是在后台,前台做的东西不多
1.用户选好了商品后,点击提交订单(一般是这样),选择使用支付宝付款。
2.手机客户端(你做的APP)把用户选择的商品的信息传给你们后台服务器。
3.后台的服务器将各种数据拼接签名后生成一个签名后的字符串,回传到客户端APP上。
4.用户点击确认支付按钮,调用手机支付宝客户端(在你手机上装的那个),利用后台传过来的那个参数调起支付宝,让支付宝客户端传给他们服务器交互,进行付款。(这一步是支付宝自己完成的,安全性高)
5.支付宝的服务器将支付的结果(可能成功也可能不成功)返回给手机支付宝客户端和你们公司的后台服务器。
6.你们公司后台服务器收到后一般是更新下数据信息(这个咱们不用管),手机支付宝客户端会显示一下支付成功,咱们的客户端也可以显示一个订单支付成功之类的东西(就像在手机12306订票,用支付宝支付后支付宝客户端会说一次支付成功,12306也会说一次支付成功,咱们就像12306客户端一样,需要再说一次订单支付成功)。
到这里就完成了支付的过程了。我觉得这个流程还是很容易理解的。
其中咱们就是商户客户端需要做的就是:
• 调用支付宝支付接口
• 处理支付宝返回的支付结果
集成流程直接看官方文档即可,我下面的只是个别流程,根据sdk把这些全部拖到项目
报错1 Unknown type name 'NSSring'和Cannot find interface declaration for 'NSObject', superclass of 'Base64'
导入#import <Foundation/Foundation.h>即可
报错2 'openssl/asn1.h' file not found
意思就是找不到文件,解决方法如下
在build settings 里搜"header search",找到header search paths ,把值设为$(PROJECT_DIR)/项目名称,如图
参考文章:点击打开链接
参考文章:点击打开链接
微信
微信支付流程:
- 用户使用APP客户端,选择商品下单。
- 商户客户端(就是你做的APP)将用户的商品数据传给商户服务器,请求生成支付订单。
- 商户后台调用统一下单API向微信的服务器发送请求,微信服务器生成预付单,并生成一个prepay_id返回给商户后台。
- 商户后台将这个prepay_id返回给商户客户端(这里一共需要6个参数传给服务端)。
- 用户点击确认支付,这时候商户客户端调用SDK打开微信客户端,进行微信支付。
- 微信客户端向微信服务器发起支付请求并返回支付结果(他们之间交互用的就是prepay_id这个参数,微信的服务器要验证微信客户端传过去的参数是否跟第三步中生成的那个id一致)。
- 用户输入支付密码后,微信客户端提交支付授权,跟微信服务器交互,完成支付
- 微信服务器给微信客户端发送支付结果提示,并异步给商户服务器发送支付结果通知。
- 商户客户端通过支付结果回调接口查询支付结果,并向后台检查支付结果是否正确,后台返回支付结果。
- 商户客户端显示支付结果,完成订单,发货。
- SystemConfiguration.framework
- libz.tbd
- libsqlite3.0.tbd
- CoreTelephony.framework
- QuartzCore.framework
-
- 2:设置URL Scheme
- 商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。如图所示。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/**
* 向微信终端注册ID,这里的APPID一般建议写成宏,容易维护。@“测试demo”不需用管。这里的id是假的,需要改这里还有target里面的URL Type
*/
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"测试demo"];
return YES;
}
//前面的两个方法被iOS9弃用了,如果是Xcode7.2网上的话会出现无法进入进入微信的onResp回调方法,就是这个原因。本来我是不想写着两个旧方法的,但是一看官方的demo上写的这两个,我就也写了。。。。
//9.0前的方法,为了适配低版本 保留
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [WXApi handleOpenURL:url delegate:self];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [WXApi handleOpenURL:url delegate:self];
}
//9.0后的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary
*)options{
//这里判断是否发起的请求为微信支付,如果是的话,用WXApi的方法调起微信客户端的支付页面(://pay 之前的那串字符串就是你的APPID,)
return [WXApi handleOpenURL:url delegate:self];
}
//微信SDK自带的方法,处理从微信客户端完成操作后返回程序之后的回调方法,显示支付结果的
-(void) onResp:(BaseResp*)resp
{
//启动微信支付的response
NSString *payResoult = [NSString stringWithFormat:@errcode:%d, resp.errCode];
if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
switch (resp.errCode) {
case 0:
payResoult = @支付结果:成功!;
break;
case -1:
payResoult = @支付结果:失败!;
break;
case -2:
payResoult = @用户已经退出支付!;
break;
default:
payResoult = [NSString stringWithFormat:@支付结果:失败!retcode = %d, retstr = %@, resp.errCode,resp.errStr];
break;
}
}
}
//调起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = [dict objectForKey:@"partnerid"]; //商户号
req.prepayId = [dict objectForKey:@"prepayid"]; //预支付交易会话ID
req.package = @"Sign=WXPay"; //扩展字段,固定值
req.nonceStr = [dict objectForKey:@"nonceStr"]; //随机串,防重发
req.timeStamp = [[dict objectForKey:@"timeStamp"] intValue];//时间戳,防重发
req.sign = [dict objectForKey:@"signType"]; //签名
[WXApi sendReq:req];