微信支付

微信支付

移动支付盛行,app接入逐渐成为标配

今天和大家分享一下微信支付的接入

调起微信支付的整个流程是:

一、在appDelegate中配置,并写好方法接受微信返回信息,

二、调用后台接口(自定义)与微信交互,微信返回必要参数,其中最主要一个参数是prepay_id

三、使用appid、noncestr(下面有详细生成方法)package(目前为固定值,直接给@"Sign=WXPay")、partnerid(就是mchId)timestamp(时间戳)、prepayid生成签名sign

四、将必要参数传给PayReq对象

五、最后,使用WXApi的sendReq方法吊起微信。

下面开始贴方法:

准备工作:

1.到微信开放平台,申请开通支付功能(唯一注意,bundleId需与工程一致),在财付通回馈的邮箱中获取以下信息(注:以下信息已修改,不可直接复制使用)

  APP_ID @"wxf120b5260432545"                                  //APPID
  APP_SECRET @"998d17563f0d6d0181b90ff543656ygrs"              //appsecret
  MCH_ID @"1269999401"                                        //商户号
  PARTNER_ID @"xbM5MBCVOj2sEAs8KrMfwla4djpcQKuvG9"            //商户API密钥

2.下载微信支付SDK

3.AppDelegate 可直接复制使用

#import "WXApi.h"
#import "WXApiObject.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
        // 1.注册微信
        [WXApi registerApp:WECHAT_APPID withDescription:@"weichatpayblog"];
        return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
        return [WXApi handleOpenURL:url delegate:self];
}
- (void)onResp:(BaseResp *)resp
{
        NSString *strMsg = [NSString stringWithFormat:@"errcode:%d",resp.errCode];
        NSString *strTitle;
        NSString *strNote;
        if ([resp isKindOfClass:[PayResp class]]) {
              // 支付返回结果,实际支付结果需要去微信服务器端查询
              strTitle = @"支付结果";
        }
        switch (resp.errCode) {
              case WXSuccess:{
                    strMsg = @"支付成功,可以进行洗车";
                    strNote = @"success";
                    break;
              }
              case WXErrCodeUserCancel:{
                    strMsg = @"支付已取消";
                    strNote = @"cancel";
                    break;
              }
              case WXErrCodeSentFail: {
                    strMsg = @"支付失败,请重新支付";
                    strNote = @"fail";
                    break;
              }
              default:{
                    strMsg = @"支付失败";
                    strNote = @"fail"; 
                    break;
              }
        }
        [[NSNotificationCenter defaultCenter] postNotificationName:ORDER_PAY_NOTIFICATION object:strNote];
        [Alert showWithTitle:strMsg];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
        return [WXApi handleOpenURL:url delegate:self];
}

4.调起支付

  #import "WXApi.h"
  #import "WXApiObject"
  #import "WXUtil.h"
  - (void)clickPayWithWechat
  {
        // 判断客户端是否安装微信/版本是否支持 
        if ([self isWXAppInstalled]) {
              [self updateOrderInfoToWechat];
        }
  }
  - (BOOL)isWXAppInstalled
  {
        // 1.判断是否安装微信
        if (![WXApi isWXAppInstalled]) {
              [Alert showWithTitle:@"您尚未安装\"微信App\",请先安装后再返回支付"];
              return NO;
        }
        // 2.判断微信的版本是否支持最新Api
        if (![WXApi isWXAppSupportApi]) {
              [Alert showWithTitle:@"您微信当前版本不支持此功能,请先升级微信应用"];
              return NO;
        }
        return YES;
  }
  - (void)updateOrderInfoToWechat
  {
         // 调用自己后台接口
         // 返回 prePay_id  
         // wechatModel 为自定义模型 存储微信支付所需参数
        if (wechatModel.prepay_id != nil) {
              DLog(@" %@ ",wechatModel.prepay_id);
              NSString *package, *time_stamp, *nonce_str;
              time_t now;
              time(&now);
              time_stamp = [NSString stringWithFormat:@"%ld",now];
              nonce_str = [WXUtil md5:time_stamp];
              package = @"Sign=WXPay";
              NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
              [signParams setObject:WECHAT_APPID forKey:@"appid"];
              [signParams setObject:nonce_str forKey:@"noncestr"];
              [signParams setObject:package forKey:@"package"];
              [signParams setObject:WECHAT_MCH_ID forKey:@"partnerid"];
              [signParams setObject:time_stamp forKey:@"timestamp"];
              [signParams setObject:wechatModel.prepay_id forKey:@"prepayid"];
              NSString *sign = [self createMd5Sign:signParams];
              [signParams setObject:sign forKey:@"sign"];
              // 这里 调起微信  一个参数也不能少  重要的事 我不想说三遍了,调不起会来看三遍的 哈哈哈....
              PayReq *req = [[PayReq alloc] init];
              req.openID = WECHAT_APPID;
              req.partnerId = WECHAT_MCH_ID;
              req.prepayId = wechatModel.prepay_id;
              req.nonceStr = nonce_str;
              req.timeStamp = time_stamp.intValue;
              req.package = package;
              req.sign = sign;
              [WXApi sendReq:req];
        }    
  }
  -(NSString*) createMd5Sign:(NSMutableDictionary*)dict
  {
        NSMutableString *contentString  =[NSMutableString string];
        NSArray *keys = [dict allKeys];
        //按字母顺序排序
        NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
              return [obj1 compare:obj2 options:NSNumericSearch];
        }];
        //拼接字符串
        for (NSString *categoryId in sortedArray) {
              if (![[dict objectForKey:categoryId] isEqualToString:@""] && ![categoryId isEqualToString:@"sign"] && ![categoryId isEqualToString:@"key"])
        {
              [contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]];
        }

        }
        //添加key字段
        [contentString appendFormat:@"key=%@", wechatModel.key];
        //得到MD5 sign签名
        NSString *md5Sign =[WXUtil md5:contentString];
        //    //输出Debug Info
        //    [debugInfo appendFormat:@"MD5签名字符串:\n%@\n\n",contentString];
         return md5Sign;
  }

至此 应该已经成功调起微信支付了,在这个类当中,添加观察者,对跳转后的信息处理

将状态信息传给自己的后台 就结束了

过程中需要注意的是

1.传个PayReq对象的参数不能少

2.如果工程中使用了友盟,会出现冲突,因为友盟的包里包含了微信sdk,删掉友盟里重复即可,这里网上有相关资料,不再赘述

如仍有问题,欢迎留言 一起探讨

【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值