前期准备:
APP微信商户申请步骤
支付流程:

商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
步骤5:商户后台接收支付通知。api参见【支付结果通知API】
步骤6:商户后台查询支付结果。,api参见【查询订单API】
1、用户需要先向服务器提交订单信息
2、服务器统一下单:
商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付。
3、App调起微信客户端需要的参数:
支付回调地址,用于显示支付结果
1
| http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php //获取服务器端支付数据地址(商户自定义)
|
返回的参数格式
1 2 3 4 5 6 7 8 9
| { "appid": "wxb4ba3c02aa476ea1", "noncestr": "d1e6ecd5993ad2d06a9f50da607c971c", "package": "Sign=WXPay", "partnerid": "10000100", "prepayid": "wx20160218122935e3753eda1f0066087993", "timestamp": "1455769775", "sign": "F6DEE4ADD82217782919A1696500AF06" }
|
参考资料
0、iOS开发支付集成之微信支付
1、微信商户平台
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCws5EkOHuSpNoLf4t9+YwQDnA/jMylfsazcklv8YVJbNSlkGP37QOFYxEpxajisPt2rAGe57Ut8ASRHqoqqXu8j65L
PKNP/6Jl4vwouNHFAfwLBQvQnBOiRvQIQASX624x1zUArpm0+ahCXRt+gtcCmUER
QIGFcA+8Hk8OU6A9+wIDAQAB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| //============================================================ // V3&V4支付流程实现 // 注意:参数配置请查看服务器端Demo // 更新时间:2015年11月20日 //============================================================
NSData * response = [self getPrepayData];//获取预付单 获取统一下单接口 得到的数据 if ( response != nil) { // 获取预付单成功 NSMutableDictionary *dict = NULL; NSError * error ; dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];//进行解析 if(dict != nil){ NSMutableString *retcode = [dict objectForKey:@"retcode"]; if (retcode.intValue == 0){ NSMutableString *stamp = [dict objectForKey:@"timestamp"]; /** 这些内容需要从服务器端生成 */ //调起微信支付 PayReq* req = [[PayReq alloc] init]; req.partnerId = [dict objectForKey:@"partnerid"]; req.prepayId = [dict objectForKey:@"prepayid"]; req.nonceStr = [dict objectForKey:@"noncestr"]; req.timeStamp = stamp.intValue; req.package = [dict objectForKey:@"package"]; req.sign = [dict objectForKey:@"sign"]; // sendReq请求调用后,会切到微信终端程序界面。(调起微信) [WXApi sendReq:req]; //日志输出 NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign ); }else{ NSLog(@"%@", [dict objectForKey:@"retmsg"]); } }else{ NSLog(@"服务器返回错误,未获取到json对象"); } }else{ NSLog(@"获取统一下单数据失败"); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #pragma mark //获取预付单 //获取预付单 + (NSData *)getPrepayData{ //解析服务端返回json数据 //这个接口模拟了 获取预付单的接口 /* * 正真开发需要上传对应的商品信息 调用微信 统一下单 的接口 //文档地址 */ NSString *urlString = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios"; //加载一个NSURL对象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; //将请求的url数据放到NSData对象中 NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; return response; }
|
需要在APPDelete中设置代理, 并遵循协议
//通过此代理对象,调用代理方法 这里设置的代理方法与调用方法相关
1
| [WxApi handleOpenURL:url delegate:self];
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #pragma mark 当前应用程序通过 sendReq 跳转到微信客户端 微信客户端返回到当前应用时会被调用 (前提 AppDelegate 中实现接受微信应用跳转到当前应用的方法(需要设置代理)) -(void) onResp:(BaseResp*)resp //如果第三方程序向微信发送了sendReq的请求,那么onResp会被回调。 { //支付返回结果 NSString *strMsg,*strTitle = [NSString stringWithFormat:@"支付结果"]; switch (resp.errCode) { case WXSuccess: strMsg = @"支付结果:成功!"; NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode); break; default: strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr]; NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr); break; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; }
|
1 2 3 4 5 6
| /** * 应用调取Wx时,走的协议方法 */ - (void)onReq:(BaseReq *)req{ NSLog(@"请求类型:%d, openID:%@", req.type, req.openID); }
|