美文网首页
iOS微信支付——APP调用微信支付接口

iOS微信支付——APP调用微信支付接口

作者: andy_xin | 来源:发表于2018-02-28 11:38 被阅读152次

    一、准备工作

    1.必须通过微信审核的微信APPID 不然就没法实现微信支付功能

    2.查看iOS微信支付官方文档去集成到你的工程文件中 微信支付官方文档

    这两步做好后就可以开始调用微信支付接口来支付了,下面看具体怎么做

    二 调起微信支付接口

    2.1 集成微信支付SDK后在你的 AppDelegate.m 中注册微信的APPID


    - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {

    //微信支付

    [WXApi  registerApp:@"你的APPID"  withDescription:@"最好是填APP名"];

    }

    2.2  从自己的服务器获取订单的预支付信息,前提是服务器端已经调用了微信的统一下单接口

    从服务器获取的信息中的信息是:

    appid = 123456789;//从服务器获取的

    "mch_id" = 1426349502;

    "nonce_str" = Jtk3gcIfmsyYKyx7;

    "prepay_id" = wx2017010311540938e8e489660575993008;

    "result_code" = SUCCESS;

    "return_code" = SUCCESS;

    "return_msg" = OK;

    sign = 562787A84AE02285F6AB3509C174491B;

    "trade_type" = APP;

    先看代码,再说明存在的坑

    NSDate*datenow = [NSDatedate];//现在时间,你可以输出来看下是什么格式

    //时间转时间戳的方法:

    NSString*timeSp = [NSStringstringWithFormat:@"%ld", (long)[datenowtimeIntervalSince1970]];

    NSLog(@"timeSp:%ld",(long)[timeSpintegerValue] );//时间戳的值

    NSMutableDictionary*dic = [NSMutableDictionarydictionaryWithCapacity:10];

    dic[@"appid"] =@"你的APPID";//可以写死,也可以写成 从服务器获取的appid,

    dic[@"partnerid"] = responseObject[@"result"][@"mch_id"];//商户ID

    dic[@"prepayid"] = responseObject[@"result"][@"prepay_id"];

    dic[@"noncestr"] = responseObject[@"result"][@"nonce_str"];

    dic[@"timestamp"] = [NSStringstringWithFormat:@"%ld",(long)[timeSpintValue]];

    dic[@"package"] =@"Sign=WXPay";

    BZLog(@"=====%@",dic);

    NSMutableString*contentString=[NSMutable Stringstring];

    NSArray*keys = [dicallKeys];

    //按字母顺序排序

    NSArray*sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(idobj1,idobj2) {

    return[obj1 compare:obj2 options:NSNumericSearch];

    }];

    BZLog(@"+++++%@",sortedArray);

    //拼接字符串

    for(NSString*categoryIdinsortedArray) {

    if(![[dic objectForKey:categoryId] isEqualToString:@""]

    && ![[dic objectForKey:categoryId] isEqualToString:@"sign"]

    && ![[dic objectForKey:categoryId] isEqualToString:@"key"]

    )

    {

    [contentString appendFormat:@"%@=%@&", categoryId, [dicobjectForKey:categoryId]];

    }

    }

    //添加商户密钥key字段API密钥

    [contentStringappendFormat:@"key=%@",@"575fe81f69ad0dc054c35f478de8d70e"];

    BZLog(@"contentString%@",contentString);

    NSString*md5SignStr = [BZNetworkingManage MD5StrWithSignStr:contentString];//md5加密

    //调起微信支付

    PayReq*req= [[PayReqalloc]init];

    req.partnerId= dic[@"partnerid"];//商户ID

    req.prepayId= dic[@"prepayid"];

    req.nonceStr= dic[@"noncestr"];

    UInt32timeStamp =[dic[@"timestamp"]intValue];

    req.timeStamp= timeStamp;

    req.package=@"Sign=WXPay";

    req.sign= md5SignStr;

    [WXApisendReq:req];

    存在的坑:

    1.可能在调起微信后,只出现了一个确定按钮的界面的,点击确定返回回调值是 -2 ,出现这个问题所在的原因是req属性值错了,最有可能的原因是sign 错了

    1.从服务器获取的预支付信息中有签名 sign ,开始的时候我也直接用这个 sign 赋值给req.sign ,但是出现了调起微信后只出现一个确定按钮,这就是sign的坑所在,不能用服务器返回的sign传过去,需要重新签名。具体参照上面的代码。

    相关文章

      网友评论

          本文标题:iOS微信支付——APP调用微信支付接口

          本文链接:https://www.haomeiwen.com/subject/wjngvttx.html