前期准备:

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);
}