前言:
开发文档
#一共需要两次签名
#第一次
`是刚开始,把商品信息传给后台,生成的订单`
`把订单号传给后台(我们这里也把价格传给了后台),后台进行第一次签名,生成了预付订单,同时返回了prepayid`
#第二次
`需要的参数为:
appid、
partnerid(商户id)、
prepayid、
noncestr(随机字符串)、
timestamp(时间戳,iOS只支持10位数,Java生成的一般为13位的毫秒,可以/1000来达到目的。PHP生成的为10位的秒)、
package(固定参数Sign=WXPay)`
#注意:不要传多余的参数,比如第一次签名传的商品信息,都不要在二次签名的时候传入,不然就会出现“支付签名认证失败”。
iOS客户端调起微信的代码:
//发起微信支付,设置参数
PayReq *request = [[PayReq alloc] init];
/**
openID:
由用户微信号和AppID组成的唯一标识,发送请求时第三方程序必须填写,用于校验微信用户是否换号登录
//这个不用传,appid已经在后台签名时拼接上了。(PayReq中也没有这个参数。œ)
*/
// request.openID = WXAPPKEY;
request.partnerId = response[@"map"][@"mch_id"];
request.prepayId= response[@"map"][@"prepay_id"];
request.package = @"Sign=WXPay";
//后台返回的随机字符串
request.nonceStr = response[@"map"][@"nonce_str"];
//后台返回的时间戳(必须为10位数(单位:秒)),必传
request.timeStamp = [response[@"map"][@"curr_time"] intValue];
// 签名加密
request.sign=response[@"map"][@"sign"]; //注意这里的签名是把所有的信息都放在里面了,这里默认放了字段支付1元
// 调用微信
[WXApi sendReq:request];
if ([WXApi sendReq:request]) {
NSLog(@"调起成功");
}
URL scheme其实就是个唯一标识
在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,
在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id。
注意:
下面是交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。
// 调用微信(注意sendReq只能调用一次,第二次不会成功。)
if ([WXApi sendReq:request]) {
NSLog(@"调起成功");
}