前言

一直以为支付宝的文档写的已经够烂了,后来我才发现我太年轻了,那是因为我还没有遇到微信的文档,简直坑爹。。。

支付业务流程

商户系统和微信支付系统主要交互说明:

步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【[统一下单API](https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_1)】。

步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

步骤4:商户APP调起微信支付。api参见本章节【[app端开发步骤说明](https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5)】

步骤5:商户后台接收支付通知。api参见【[支付结果通知API](https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_7)】

步骤6:商户后台查询支付结果。,api参见【[查询订单API](https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_2)】

Paste_Image.png

注意

1.微信支付现在已经很便捷了,提供了统一下单接口,自己的后台服务器调用该接口,获取prepayId

2.最重要的一步,也是网上现在坑最多的一步,调用统一下单接口后,微信返回格式如下,而这么多数据中,真正对我们有用的只有 预支付订单号prepayId,微信返回的sign没有任何用,我们得根据签名规范重新生成签名(关于这点,上面的流程交互中就有提到),然后将重新生成的签名返回给APP端,用于APP端调用微信支付。(当然重新生成签名的步骤也可以放在APP端来做,不过为了安全考虑,建议放在服务端处理,下面也会给出APP端签名的代码)

调用统一下单接口 微信返回数据

一定要重新生成签名

Tip

很多人都遇到这样的问题,参数都处理好调用微信支付,结果进入微信界面后发现只有一个确定按钮,返回后错误码为 -2,造成这个原因的就是因为参数不对,而且大多是都是因为签名 sign 不对,没有进行二次签名,而直接拿微信返回的sign当作参数 , 所以调用微信支付接口时,一定要用 重新签名的sign!!!!

APP端调用支付时,sign不要用调用统一下单接口返回的sign,而要自己重新生成,生成规则见微信提供的签名生成算法

Paste_Image.png

相关代码如下:

APP端打开微信微信支付代码

#pragma mark - 微信支付

- (void)wechatPay:(WechatOrderModel *)model

{

//调起微信支付 model 为自己服务器返回的参数

PayReq *req = [[PayReq alloc] init];

req.partnerId = model.partnerid;

req.prepayId = model.prepayid;

req.nonceStr = model.noncestr;

req.timeStamp = model.timestamp.intValue;

req.package = model.package;

req.sign = model.sign;//sign 为自己服务器获取到预支付订单号prepayId后,重新生成的签名,当然本地也可以生成签名,签名代码如下

[WXApi sendReq:req];

//日志输出

NSLog(@"微信支付请求参数 ===== appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",model.appid,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign);

}

APP端重新生成签名(建议放在服务端处理)

#pragma mark - 微信支付本地签名

//创建发起支付时的sign签名

-(NSString *)createMD5SingForPayWithAppID:(NSString *)appid_key partnerid:(NSString *)partnerid_key prepayid:(NSString *)prepayid_key package:(NSString *)package_key noncestr:(NSString *)noncestr_key timestamp:(UInt32)timestamp_key{

NSMutableDictionary *signParams = [NSMutableDictionary dictionary];

[signParams setObject:appid_key forKey:@"appid"];//微信appid 例如wxfb132134e5342

[signParams setObject:noncestr_key forKey:@"noncestr"];//随机字符串

[signParams setObject:package_key forKey:@"package"];//扩展字段 参数为 Sign=WXPay

[signParams setObject:partnerid_key forKey:@"partnerid"];//商户账号

[signParams setObject:prepayid_key forKey:@"prepayid"];//此处为统一下单接口返回的预支付订单号

[signParams setObject:[NSString stringWithFormat:@"%u",timestamp_key] forKey:@"timestamp"];//时间戳

NSMutableString *contentString =[NSMutableString string];

NSArray *keys = [signParams allKeys];

//按字母顺序排序

NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

return [obj1 compare:obj2 options:NSNumericSearch];

}];

//拼接字符串

for (NSString *categoryId in sortedArray) {

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

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

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

)

{

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

}

}

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

[contentString appendFormat:@"key=%@", @"商户密钥"];

NSString *result = [contentString md5String];//md5加密

return result;

}

MD5 加密方法

/**

* MD5 加密

*

* @return 加密后字符串

*/

- (NSString *)md5String

{

if(self == nil || [self length] == 0) return nil;

unsigned char digest[CC_MD5_DIGEST_LENGTH], i;

CC_MD5([self UTF8String], (int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);

NSMutableString *ms = [NSMutableString string];

for(i=0;i

{

[ms appendFormat: @"%02x", (int)(digest[i])];

}

return [ms copy];

}

至此微信集成结束,坑的地方就是 app端调用微信支付时的签名参数sign一定要重新生成,不要使用统一下单接口返回的sign,切记!!!!

记录点滴,与君共勉。

ios微信支付失败 php,iOS微信支付的那些坑相关推荐

  1. ios微信支付失败 php,iOS 微信支付疑难杂症。

    哈喽,大家好,感谢您来阅读我的文章,作为iOS开发者,集成各类支付是家常便饭之事,今天我来给大家推荐几个不常见的微信支付问题. 最近,在项目的反馈版块中,收到了这么一位APP用户的反馈,他在使用我们家 ...

  2. php 发送微信请求失败的原因,微信小程序模拟正常 真机服务器请求出错

    微信小程序中出现最多的一个问题,就是真机跟本地不同:我简单列举一些我发现的原因,给大家参考,大家也可以把自己发现的东西回复给我,给我参考: 本地看不到数据,就先让本地能看到数据,再看本帖.... 1: ...

  3. 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态

    微信支付 微信支付开发的整体思路 生成支付二维码 查询支付状态(微信的服务器) 实现订单状态的修改.删除订单 支付状态回查->微信服务器将支付状态返回给支付微服务 MQ处理支付回调状态 Rabb ...

  4. 基于vue-cli3开发微信公众号网页——调取微信分享,微信支付接口

    第一步安装微信jdk npm install weixin-js-sdk 第二步封装微信接口方法 //微信支付方法 import wx from "weixin-js-sdk"; ...

  5. 微信小程序netcore后台api支付结果通知接口的坑

    终于搞定回调通知了,这里总结下几个暗坑 1.回调通知一定是post接口,且可以直接访问 2.需要解析回调的HttpContext内容才能知道结果 3.收到信息一定要进行验证判断是否来自于微信渠道 4. ...

  6. 谈一谈APP支付失败的处理

    如题今天要描述一个问题是:程序在确认订单时拉起第三方支付,支付失败了,引起的问题. 为了能清楚的描述问题,我把场景复现一下,大家肯定都有过APP购物的体会,大家一定知道有一个按钮叫"确认&q ...

  7. Stripe支付,国外支付Stripe、跨境支付

    好记星不如烂笔头,这里记录平时工作中用到的东西,不喜可以留言. 美国跨境支付stripe 测试说明,你需要办理至少一张国际信用卡, 比如visa.master.AE(American Express ...

  8. 【问题排查与解决】ios调起微信小程序支付失败

    ios调起微信小程序支付SDK失败 场景 排查方向(1. 支付规范导致2. 参数缺少导致3. sdk版本问题) 微信小程序支付规范 解决方式 调起微信小程序参数问题(需要传入当前小程序的appId) ...

  9. uni-app H5兼容ios问题+微信扫一扫、微信支付等常用api代码封装

    最近公司需要用uni开发一个项目,项目中遇到的问题记录一下,方便下次不采坑 场景:         使用wx自带sdk完成,扫一扫.微信登录.微信支付 引用方式: // index.html引入 &l ...

  10. java ios支付接口开发_微信支付接入(Android/IOS(swift)/Java后台)

    创建 包名.wxapi.WXPayEntryActivity 文件,保证内容如下(WechartUtils下面会给出): import android.app.Activity; import and ...

最新文章

  1. 动态阈值--大津法理解
  2. redis中的crc16算法
  3. swfupload 进度条 提示 中文乱码
  4. 【玩转cocos2d-x之八】精灵类CCSprite
  5. abap视图字段限制_在 Laravel 控制器中进行表单请求字段验证
  6. 在香蕉派的树莓派系统上配置 Syncthing 自启动(暨 Linux 软件自启服务配置)
  7. background 旋转_第4章 旋转的圆弧(《Python趣味创意编程》教学视频)
  8. web开发者工具,你必须知道的CSS盒模型,架构师必备!
  9. 这帮吃货程序猿,给阿里食堂来了一波骚操作
  10. jQuery1.11源码分析(8)-----jQuery调用Sizzle引擎的相关API
  11. 每日算法系列【LeetCode 825】适龄的朋友
  12. [20171218]varchar2(4000)如何保存.txt
  13. 一键清理电脑垃圾小程序
  14. 25条很棒的Python一行代码,建议收藏!
  15. windows使用Apple的Trackpad
  16. matlab latex emf 乱码,latex 使用中的一些问题
  17. L298N电机驱动模块的接线使用与代码实现
  18. Interpretable Machine Learning中GLM,GAM等
  19. 2013年MBA、MPA、MPAcc入学考试英语辅导教材
  20. 深度对比Soul、觅伊,两款社交软件区别在哪?

热门文章

  1. 商业数据库之死:Oracle 的困境
  2. ocr证件护照识别器,阅读器,扫描仪
  3. 好用的网页在线客服工具
  4. 私钥、证书、USBKey
  5. 国产手机的18年历史
  6. win10 电脑扬声器显示未插入
  7. java 计算球体积方法,球体体积计算公式 我计算求得的球体和球壳的转动惯量都是实际值的一......
  8. BP,RNN 和 LSTM暨《Supervised Sequence Labelling with Recurrent Neural Networks-2012》阅读笔记
  9. 计算机考研专业课——c语言
  10. 联想微型计算机安装Win7,联想一体机如何安装win7_联想一体机怎么使用u盘重装win7...