微信支付
一、在微信开放平台上注册
注册步骤:
1.首先在微信开放平台上注册,在账号中心填写开发者资质审核申请,等待审核通过。
2.在管理中心注册应用,如果应用需要支付,则需填写企业资质、经营类目、结算账户
审核通过后,会在你的邮件里获取商户号:
3.商户登录商户平台,填写结算账户;
4.在线签署《微信支付服务协议》
5.获得微信支付能力
记住应用AppID和AppSecret,还有前面微信支付商户号,API秘钥在商户平台获得,AppID在客户端应用中会使用,AppSecret和微信支付商户号、API秘钥在服务器端使用
二.微信支付流程
商户系统和微信支付系统主要交互说明:
步骤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】
三.微信配置
微信支付文档官方网址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
1.下载SDK,微信支付SDK1.6.2包含:WXApiObject.h、WXApi.h、WechatAuthSDK.h、libWeChatSDK.a四个文件,将这4个文件导入到项目中
2.修改配置
2.1 添加依赖
2.2 修改info.plist
2.3 真机调试时,需要在build setting里修改bitcode为NO
四.在应用中调用
1. 注册APPID
商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
[WXApi registerApp: @"wxb0bc3dc898cc0298" withDescription: @“demo 2.0”];//记得 用自己appid替换
2、调起支付
商户服务器生成支付订单,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是客户端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];
注意:该sign生成字段名列表见调起支付API
3、支付结果回调
照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:
-(void)onResp:(BaseResp*)resp{
if ([resp isKindOfClass:[PayResp class]]){
PayResp*response=(PayResp*)resp;
switch(response.errCode){
case WXSuccess:
//服务器端查询支付通知或查询API返回的结果再提示成功
NSlog(@"支付成功");
break;
default:
NSlog(@"支付失败,retcode=%d",resp.errCode);
break;
}
}
}
回调中errCode值列表:
名称 | 描述 | 解决方案 |
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |