微信支付
商家系统和微信支付系统主要交互说明:
步骤1:用户在商品APP选择商品,提交订单,选择微信支付.
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口.
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP.参与签名的字段名为appid,partnerId,prepayid,nonceStr,timestamp,package.注意:package的值为Sign=WXPay.
步骤4:商户APP调起微信支付.
步骤5:商户后台接受支付通知.
步骤6:商户后台查询支付结果
iOS端开发步骤说明
项目设置APPID
商户在微信开发平台申请开发APP应用后,微信开发平台会生成APP的唯一标识,APPID.在Xcode中打开项目,设置项目属性中的URL Sechemes为您的APPID.并在info.plist中设置白名单.
注册APPID
具体配置说明请参考微信支付官方文档
商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
调起支付
商户服务器端生成支付订单,先调用生成预订单,获取到prepay_id后将参数再次签名传输给APP发起支付.以下是调起微信支付的关键代码;
PayReq *request = [[[PayReq alloc] init] autorelease];
request.partnerId = @"10000100";
request.prepayId= @"1101000000140415649af9fc314aa427";
request.package = @"Sign=WXPay";
request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
request.timeStamp= @"1397527777";
request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
[WXApi sendReq:request];
支付结果回调
在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:
首先在Appdelegate.m里面实现该方法
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url option:(NSDictionary <NSString *id> *)options
{
/**处理微信通过URL启动app是传递的数据
*需要在 application:openURL:souceApplication:annotation或者application:handleOpenURL中调用.
*@param url 微信启动第三方应用时传递过来的URL
*@param delegate WXAppDelegate对象,用来接收微信触发的消息
*@return 成功返回YES, 失败返回NO
*/
return [WXApi handleOpenURL:url delegate:self];
}
接下来我们需要遵守下协议
遵守WXapiDelegate协议.png最后一步就是等待支付结果出来以后回调一个函数了.
/**发送一个sendReq后,收到微信的回应
*收到一个来自微信的处理结果,调用一次sendReq后会收到OnResp;
*可能收到的处理结果有SendMessageToWXResp,SendAuthResp等
*@param resp具体的回应内容
*/
-(void)onResp:(BaseResp*)resp{
if ([respisKindOfClass:[PayRespclass]]){
PayResp*response=(PayResp*)resp;
switch(response.errCode){
caseWXSuccess:
//服务器端查询支付通知或查询API返回的结果再提示成功
NSlog(@"支付成功");
break;
default:
NSlog(@"支付失败,retcode=%d",resp.errCode);
break;
}
}
}
支付宝支付
支付宝支付大致流程:
a. 公司与支付宝进行签约,获取商户ID(partner)和账号ID(seller)和公钥(privateKey),这些开发中会用到,很重要!
b. 商户在b.alipay.com中进行签约.
c. 审核:商户登录py.alipay.com 可在”签约订单”中查看审核进度.
d. 下载支付宝SDK.
e. 生成订单,签名加密.
f. 开始支付,调起支付包客户端或者网页端,然后进行支付,由支付宝与银联系统进行系统进行打交道,并由支付宝处理的结果返回给客服端.
g. 展示支付结果给客户.
上图中的”商户客户端”就是iOS客户端需要做的事情.
a. 调用支付宝支付接口,发送订单
b. 处理支付宝返回的支付结果
注:在调用支付宝支付接口前,我们还需要生成一个订单,订单的生成可以放在客户端也可以放在服务器端,最好是放在服务器端,因为放在服务器端的话,你可以掌握所有的订单,而且也比较安全.
c.如果对安全性要求不高的做完以上两步支付功能已经完成.但是如果考虑安全性的问题,则需要在生成订单和支付结果的时候做一次安全校验,目前官方校验只支持使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名。
客户端集成支付宝SDK流程
步骤1:启动IDE(开发工具),如Xcode,在官方下载iOS支付宝SDK,解压文件并拷贝导入到项目目录中,添加必要的依赖库.
添加依赖库有.png步骤2:在需要调用AlipaySDK的文件夹中,添加头文件引用
步骤3:组装请求信息(注:这一步应该在商户服务器端完成,商户服务器端直接将组装和签名后的请求字符串orderString传给客户端,客户端直接调用支付接口传给SDK发起支付请求), Alipay接口主要为商户提供订单支付功能。接口所提供的方法,如下表所示
支付宝支付功能接口列表.png步骤4:配置支付宝客户端返回url处理方法.在Appdelegate中做一下demo业务处理
步骤5: 当这笔交易被买家支付成功后支付宝收银台上显示该笔交易成功,并提示用户“返回”。此时在APAppDelegate.m的 - (BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中调用获取返回数据的代码【iOS9.0以上(包括iOS9.0)需要在 - (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中执行 】
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
[self alipayUrlAction:url];
return YES;
}
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
//有多中支付方式,要用scheme 来进行判断,看是那种途径的url.
[self alipayUrlAction:url];
return YES;
}
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
[self alipayUrlAction:url];
return YES;
}
-(void)alipayUrlAction:(NSURL *)url{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
if ([[resultDic valueForKey:@"resultStatus"] intValue] == 9000) {
if ([_aliDelegate respondsToSelector:@selector(alipydidSuccess)]) {
[_aliDelegate alipydidSuccess];
}
}else{
if ([_aliDelegate respondsToSelector:@selector(alipydidFaile)]) {
[_aliDelegate alipydidFaile];
}
}
}];
}
网友评论
[_aliDelegate alipydidSuccess]; 哥们你这个成功点击成功 跳转方法怎么写的啊