微信官方文档
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
微信支付需要得到以下字段
/** 商家向财付通申请的商家id */
@property (nonatomic, retain) NSString *partnerId;
/** 预支付订单 */
@property (nonatomic, retain) NSString *prepayId;
/** 随机串,防重发 */
@property (nonatomic, retain) NSString *nonceStr;
/** 时间戳,防重发 */
@property (nonatomic, assign) UInt32 timeStamp;
/** 商家根据财付通文档填写的数据和签名 */
@property (nonatomic, retain) NSString *package;
/** 商家根据微信开放平台文档对数据做的签名 */
@property (nonatomic, retain) NSString *sign;
发起支付请求:
1.参数模型
@class DHXWXPayInfo;
@interface DHXOrderInfo : NSObject
//NOTE: 订单号
@property (nonatomic, copy) NSString *order_sn;
//NOTE: 支付方式
@property (nonatomic, copy) NSString *pay_way;
//NOTE: 微信支付参数
@property (nonatomic, strong) DHXWXPayInfo *wxPayInfo;
@end
@interface DHXWXPayInfo : NSObject
//NOTE: 由用户微信号和AppID组成的唯一标识,用于校验微信用户
@property (nonatomic, copy) NSString *appid;
//NOTE: 随机编码,为了防止重复的,在后台生成
@property (nonatomic, copy) NSString *noncestr;
//NOTE: 根据财付通文档填写的数据和签名
@property (nonatomic, copy) NSString *package;
//NOTE: 商家id,在注册的时候给的
@property (nonatomic, copy) NSString *partnerid;
//NOTE: 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你
@property (nonatomic, copy) NSString *prepayid;
//NOTE: 签名也是后台做的
@property (nonatomic, copy) NSString *sign;
//NOTE: 时间戳,也是在后台生成的,为了验证支付的
@property (nonatomic, copy) NSString *timestamp; @end
2.发起支付
if ([WXApi isWXAppInstalled]) {
NSLog(@"用户已安装微信");
PayReq *request = [[PayReq alloc] init];
request.partnerId = _orderInfo.wxPayInfo.partnerid;
request.prepayId= _orderInfo.wxPayInfo.prepayid;
request.package = _orderInfo.wxPayInfo.package;
request.nonceStr= _orderInfo.wxPayInfo.noncestr;
request.timeStamp= (UInt32)[_orderInfo.wxPayInfo.timestamp integerValue]; request.sign= _orderInfo.wxPayInfo.sign;
[WXApi sendReq:request];
}else {
NSLog(@"用户未安装微信");
}
坑
1.注册微信的时候 commd + b 此时编译发现出现这种问题
[WXApi registerApp:@"wxXXXXXXXXXX"];
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:
objc-class-ref in libWeChatSDK.a(MTAHelper.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法:
根据提示添加少了依赖框架CoreTelephony.frame 依赖库 添加ok
其他编译报错:
other link flag -Objc -all_load
2.APP调起微信支付,提示商户支付下单id非法 (tip:注意参数传的是否正确)
解决方式:
仔细检查一下签名的字段是否正确,我做的时候找了半天发现有个字段写错了,提示id非法,默默的去哭会。。。
3.无法启动微信支付的问题
解决方式:
(a).检查签名是否正确
(b)在URL Schemes中检查是否添加微信 appid
(c)是否注册appid
(d)检查数据类型是否正确
4.同样的签名android能用,iOS用就不行
解决方式:
第二次签名还是传给客户端都要用 @"Sign=WXpay",并且不能有空格
有时候服务端给的数据我们这边解决会多个空格或者解析出错,请仔细检查比对,实在不行把微信官方demo拿来套。
提别注意:
1>sign签名是否大写。
2>拼接的字符串是否按照ASCII码,从小到大排列。(建议用代码实现排序,不要手动排序,不然很容易出错的)
3>上传的参数格式"key=value&",这其中的key与value是否有错误(我就是因为一个参数的key少写了几个字母),包括是否少写了字母,写错了字母。4>是否拼接了商户自定义的密钥,也就是在微信商户平台里面自定义的密钥。并且判断是否与自己定义的密钥是否相同。
结果: