与iOS内购不同,微信的支付系统把大部分重要的工作都放在了服务端,客户端只有少量工作
我相信,各位程序在看这篇文章的时,微信的appid应该已经注册,app支付功能应该已经开通了。
重点名词:
1.客户端 :app自己的客户单
2.服务器 :app自己的服务器
3.微信 : 三方的微信平台
实现流程
1.客户端向服务器请求所有支付需要的参数
android:
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(req);
iOS:
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];
appId:是在微信开发者后台注册app时分配的唯一标识,可以保存在客户端
partnerId:是商户号,在app申请支付功能通过后分配给商户的唯一标识
prepayId:这个是服务端向微信下单时,微信返回给服务器的订单号
packageValue:固定值(一定要填)
nonceStr:随机码
timeStamp:时间戳
sign:签名,签名是各个数据的顺序不能搞错,一定要按顺序来,不然无法调动支付
客户端向服务器请求订单的时候要告诉服务器支付金额,然后服务器找微信下单,服务器拿到prepayId后,再生产随机码和时间戳一起返回给客户端
2.服务端处理
虽然appId partnerId packageValue都可以放在客户端,但是为了设计上更简洁更安全,最好所有参数都由服务器下发
3.坑:
支付返回-1:微信支付返回接口比较简单,只有成功、失败、取消。无论是什么原因失败,都返回-1,无法启动支付也返回-1
这个时候就要逐步检查了
1.appid是否正确
2.app签名(不是订单签名)是否正确
3.订单参数是不是每个都正确且有效
通常这几个是主要问题,如果确认无误,就应该是服务端返回参数的问题了
1.返回的商户号是否正确
2.订单签名是否正确,订单签名一定要按顺序,而且各个参数的名字都要准确,一个字母都不能差
4.回调
android:
publicvoidonResp(BaseRespresp){
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
if(resp.errCode == 0)
if(resp.errCode == -1)
if(resp.errCode == -2)
}
}
ios:
-(void)onResp:(BaseResp*)resp{ if ([respis KindOfClass:[PayResp class]]){ PayResp * response=(PayResp*)resp; switch(response.errCode){ case WXSuccess: //服务器端查询支付通知或查询API返回的结果再提示成功 NSlog(@"支付成功"); break; default: NSlog(@"支付失败,retcode=%d",resp.errCode); break; } } }如果已经集成了微信登录功,再集成微信支付,估计一天就够搞定了