美文网首页iOS支付技术鸡汤文fresh
iOS应用之微信支付集成

iOS应用之微信支付集成

作者: 华之曦 | 来源:发表于2016-01-14 15:13 被阅读25177次

    所有信息的生成都在前端完成,包括对订单进行sign签名以及MD5签名加密(此方法相对来说有些复杂,没有官方给的方法简单)。
    注:官方给的是v3&v4支付流程,签名和加密都是在服务器端进行,由于没有对接过,所以就暂时没有办法分享。

    1. 准备工作

    • 工程所需的微信支付SDK,如下图:
      导入工程的SDK文件
    • 微信支付所需的相关用户信息(由用户申请)
    //微信支付商户号
     #define MCH_ID  @"YOUR_MCH_ID"
    //开户邮件中的(公众账号APPID或者应用APPID)
    #define WX_AppID @"YOUR_WX_AppID"
    //安全校验码(MD5)密钥,商户平台登录账户和密码登录http://pay.weixin.qq.com 平台设置的“API密钥”,为了安全,请设置为以数字和字母组成的32字符串。
    #define WX_PartnerKey @"YOUR_WX_PartnerKey"
    //获取用户openid,可使用APPID对应的公众平台登录http://mp.weixin.qq.com 的开发者中心获取AppSecret。
    #define WX_AppSecret @"YOUR_WX_AppSecret"
    

    2. 集成开发流程

    1 . iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes(跳转程序)列为白名单,才可正常检查其他应用是否安装(引自微信支付SDK1.6.2Readme.text)。如下图:

    info里面配置添加白名单
    注:LSApplicationQueriesSchemes 下面其他的为友盟分享要添加的白名单,当然也包含微信。

    2 . 在项目属性中的URL Types中添加URL Schemes,如图中标红位置所示。

    配置URL Schemes,用来进行程序之间的跳转

    3 . 在项目工程Appdelegate.m文件里面添加注册微信支付信息,注:如果项目中第三方分享用的是友盟,在注册的时候要把友盟注册放在微信注册的前面执行。如下:

    #pragma mark - 设置第三方 注册信息
    - (void)registerMethods {
    /****************       友盟分享注册信息     *****************/
      [UMSocialData setAppKey:UMSocial_AppKey];
    
      //设置微信AppId、appSecret,分享url
      [UMSocialWechatHandler setWXAppId:WX_appID appSecret:WX_AppSecret url:@"http://www.umeng.com/social"];
    
      //设置手机QQ 的AppId,Appkey,和分享URL
      [UMSocialQQHandler setQQWithAppId:QQ_AppID appKey:QQ_AppKey url:@"http://www.umeng.com/social"];
      [UMSocialConfig hiddenNotInstallPlatforms:@[UMShareToQQ, UMShareToQzone, UMShareToWechatTimeline, UMShareToWechatTimeline]];
    
      //打开新浪微博的SSO开关,设置新浪微博回调地址,这里必须要和你在新浪微博后台设置的回调地址一致。
      // 添加SSO授权开关(使用微博原生SDK)
      [UMSocialSinaSSOHandler openNewSinaSSOWithAppKey:Sina_AppKey RedirectURL:@"http://sns.whalecloud.com/sina2/callback"];
      // 添加SSO授权开关(非微博原生SDK)
      [UMSocialSinaHandler openSSOWithRedirectURL:@"http://sns.whalecloud.com/sina2/callback"];
    /****************       友盟分享注册信息     *****************/
    
      // 先调用友盟,然后调用微信清册信息
    /****************       注册微信支付信息    *****************/
      [WXApi registerApp:WX_appID];
      // [WXApi registerApp:WX_appID withDescription:@"demo 2.0"];
      两个任选一行,还不清楚这个appdesc有何作用
    }
    

    4.配置DataMD5.m文件,本地对签名进行二次加密,如果忽略这个步骤,就会造成调起微信支付,只出现一个确定按钮。注:之前出现这个问题,被卡壳了两天才发现,FK。

    配置MD5加密文件,添加商户密钥

    5 . 在要唤起微信支付的.m文件中,直接上代码方便ctrl+c, ctrl+v

    #pragma mark - 微信支付相关方法
    - (void)weixinChooseAct {
      NSString *appid,*mch_id,*nonce_str,*sign,*body,*out_trade_no,*total_fee,*spbill_create_ip,*notify_url,*trade_type,*partner;
      //应用APPID
      appid = WX_appID;
      //微信支付商户号
      mch_id = MCH_ID;
      //产生随机字符串,这里最好使用和安卓端一致的生成逻辑
      nonce_str =[self generateTradeNO];
      body =@"微信支付时候看到的支付信息";
      //随机产生订单号用于测试,正式使用请换成你从自己服务器获取的订单号
      out_trade_no = self.gold_sn;
      //交易价格1表示0.01元,10表示0.1元
      total_fee = self.payCount;
      //获取本机IP地址,请再wifi环境下测试,否则获取的ip地址为error,正确格式应该是8.8.8.8
      spbill_create_ip =[getIPhoneIP getIPAddress];
      //交易结果通知网站此处用于测试,随意填写,正式使用时填写正确网站
      notify_url =@"www.cccuu.com";
      trade_type =@"APP";
      //商户密钥
      partner = WX_partnerKey;
      //获取sign签名
      DataMD5 *data = [[DataMD5 alloc] initWithAppid:appid mch_id:mch_id nonce_str:nonce_str partner_id:partner body:body out_trade_no:out_trade_no total_fee:total_fee spbill_create_ip:spbill_create_ip notify_url:notify_url trade_type:trade_type];
      sign = [data getSignForMD5];
      //设置参数并转化成xml格式
      NSMutableDictionary *dic = [NSMutableDictionary dictionary];
      [dic setValue:appid forKey:@"appid"];//公众账号ID
      [dic setValue:mch_id forKey:@"mch_id"];//商户号
      [dic setValue:nonce_str forKey:@"nonce_str"];//随机字符串
      [dic setValue:sign forKey:@"sign"];//签名
      [dic setValue:body forKey:@"body"];//商品描述
      [dic setValue:out_trade_no forKey:@"out_trade_no"];//订单号
      [dic setValue:total_fee forKey:@"total_fee"];//金额
      [dic setValue:spbill_create_ip forKey:@"spbill_create_ip"];//终端IP
      [dic setValue:notify_url forKey:@"notify_url"];//通知地址
      [dic setValue:trade_type forKey:@"trade_type"];//交易类型
      // 转换成xml字符串
      NSString *string = [dic XMLString];
      [self http:string];
    }
    
    #pragma mark - 拿到转换好的xml发送请求
    - (void)http:(NSString *)xml {
      [MBProgressHUD showMessage:@"正在获取支付订单..."];
      AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
      //这里传入的xml字符串只是形似xml,但是不是正确是xml格式,需要使用af方法进行转义
      manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
      [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
      [manager.requestSerializer setValue:@"https://api.mch.weixin.qq.com/pay/unifiedorder" forHTTPHeaderField:@"SOAPAction"];
      [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
            return xml;
      }];
      //发起请求
      [manager POST:@"https://api.mch.weixin.qq.com/pay/unifiedorder" parameters:xml success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding] ;
          // LXLog(@"responseString is %@",responseString);
          //将微信返回的xml数据解析转义成字典
          NSDictionary *dic = [NSDictionary dictionaryWithXMLString:responseString];
          //判断返回的许可
          if ([[dic objectForKey:@"result_code"] isEqualToString:@"SUCCESS"] &&[[dic objectForKey:@"return_code"] isEqualToString:@"SUCCESS"] ) {
              //发起微信支付,设置参数
              PayReq *request = [[PayReq alloc] init];
              request.openID = [dic objectForKey:@"appid"];
              request.partnerId = [dic objectForKey:@"mch_id"];
              request.prepayId= [dic objectForKey:@"prepay_id"];
              request.package = @"Sign=WXPay";
              request.nonceStr= [dic objectForKey:@"nonce_str"];
              //将当前事件转化成时间戳
              NSDate *datenow = [NSDate date];
              NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
              UInt32 timeStamp =[timeSp intValue];
              request.timeStamp= timeStamp;
              // 签名加密
              DataMD5 *md5 = [[DataMD5 alloc] init];
              request.sign=[md5 createMD5SingForPay:request.openID partnerid:request.partnerId prepayid:request.prepayId package:request.package noncestr:request.nonceStr timestamp:request.timeStamp];
              // 调用微信
              [WXApi sendReq:request];
              [MBProgressHUD hideHUD];
          }else{
              LXLog(@"参数不正确,请检查参数");
              [MBProgressHUD hideHUD];
              [MBProgressHUD showError:@"支付错误!"];
          }
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          LXLog(@"error is %@",error);
          [MBProgressHUD hideHUD];
          [MBProgressHUD showError:@"未完成支付"];
      }];
    }
    
    #pragma mark - 产生随机订单号
    - (NSString *)generateTradeNO {
      static int kNumber = 15;
    
      NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      NSMutableString *resultStr = [[NSMutableString alloc] init];
      srand(time(0)); // 此行代码有警告: 
      for (int i = 0; i < kNumber; i++) {
          unsigned index = rand() % [sourceStr length];
          NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
          [resultStr appendString:oneStr];
      }
      return resultStr;
    }
    

    注:上面 stand(time(0));报警告,如下图:

    类型不匹配,不知道应该怎么改,有知道的下方赐教

    6 . 最后在Appdelegate.m文件中添加微信支付结果 onResp 回调方法,非常重要:给后台发送数据进行后台数据的更新(例如:充值浩方Vip会员,微信钱包钱已经扣了,而后台没有收到信息,钱不就白花了 - - 、),如下:

    #pragma mark - WXApiDelegate
    -(void)onResp:(BaseResp *)resp {
      if ([resp isKindOfClass:[PayResp class]]) {
          PayResp*response=(PayResp*)resp;  // 微信终端返回给第三方的关于支付结果的结构体
          switch (response.errCode) {
              case WXSuccess:
              {// 支付成功,向后台发送消息
                  LXLog(@"支付成功");
                  [[NSNotificationCenter defaultCenter] postNotificationName:@"WX_PaySuccess" object:nil];
            }
                  break;
              case WXErrCodeCommon:
              { //签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                  [MBProgressHUD showError:@"支付失败"];
                  LXLog(@"支付失败");
            }
                  break;
              case WXErrCodeUserCancel:
              { //用户点击取消并返回
                  LXLog(@"取消支付");
                  [MBProgressHUD showError:@"取消支付"];
              }
                  break;
              case WXErrCodeSentFail:
              { //发送失败
                  LXLog(@"发送失败");
                  [MBProgressHUD showError:@"发送失败"];
              }
                  break;
              case WXErrCodeUnsupport:
              { //微信不支持
                  LXLog(@"微信不支持");
                  [MBProgressHUD showError:@"微信不支持"];
              }
                  break;
              case WXErrCodeAuthDeny:
              { //授权失败
                  LXLog(@"授权失败");
                  [MBProgressHUD showError:@"授权失败"];
              }
                  break;
              default:
                  break;
          }
      }
    }
    

    到此结束,忘能正常唤起微信支付。

    3. 总结

    1. 按照官方Demo来看,加密证书之类的操作也是在服务器端完成,这样商户的信息就不会暴露在前端,才能达到 "TA好,我也好"。* ps:此方法本人没有做过,以和后台司马同学商量过,后期整理出来 *。
    1. 第一次用MarkDown记录,感觉自己用着好笨,对于代码部分的应用非常不得手,多多练习。
    1. 银联支付集成,待续。

    相关文章

      网友评论

      • 你是我此世不渝的执着:你好 问一下 支付显示 appid 未关联paysignkey 是哪里出现问题了
      • b9c85d8b9fdf:spbill_create_ip 关于这个参数 到底是我需要传还是后端需要传?
      • MT_suny:srand((unsigned)time(0));
        华之曦:@MT_小宇 :+1:
      • aaa000: srand((unsigned int)time(0));
      • MrHC:您好!我们这边是后台不动,让前台生成所有数据,集成微信支付,能否给个demo?感谢感谢
      • 一个很帅的蓝孩子:那个警告那里改成srand((unsigned)time(0));或者(long)srand(time(0));就可以了
        一个很帅的蓝孩子:@华之曦 客气了,我都是向您学习呢 :grin:
        华之曦:@一个很帅的蓝孩子 嗯,受教了,谢谢。
      • CodeLuck:[dic XMLString]; 请问里面的XMLString方法是怎么把字典转换成XML的
        华之曦:@王大仙是我 你CMD+左键 点进去可以看看。
      • Wayne_Wang:请问我用最新的1.7.5 接的时候 发现官网都没有前端签名的 我要在前端签名是不是只需要把你提供的那个 md5 \GetIP \ XMLDictionary 这三个拉过去 就可以??还有我发现拉过去发现 md5里的一个头文件#import "Contast.h" 是干什么用的啊?总是报错说找不到 ?可以帮忙解答下么?
        华之曦:@冷碎音阶丿寒 #import "Contast.h",在warning处有标注。
      • e700e94dd65a:ios 10.0 之后出现闪退是为什么?
        e700e94dd65a:@华之曦 是的,能把你集成的demo发我一份吗?2633252822
        华之曦: @e700e94dd65a 唤起闪退?
      • 老牛不牛气:学习了,过两天就要用到,多谢分享
        华之曦: @老牛不牛气 有问题相互沟通。
      • 琼极一生IQ:AFHTTPRequestOperationManager 这个东西 AF3.0 取消了 那这一段应该怎么处理
      • 十三_Black:APPdelegate里-(void)onResp:(BaseResp *)resp;方法会自动掉的吗?
        华之曦: @Black_Sky 是的。
      • e4fa7826e618:支付验证签名失败是咋回事
      • 地平线上硝烟弥漫:srand((unsigned)time(0));
        网上找了下,srand(time(0))报警告是因为time返回的是有符号的,而srand接受的是无符号的
        华之曦:@地平线上硝烟弥漫 嗯,谢谢指导。
      • d920e665d3d1:大神,onresp回调中怎么判断是支付或者分享或者充值返回的结果呢,因为这些功能都集成了,
      • 2cfd7ba2b48a:楼主,为啥总是报签名错误???
        华之曦: @2cfd7ba2b48a 检查签名呗,比对一下
      • youlookdeliciou:搞定了 ,修改获取IP的方法就可以了
        华之曦: @youlookdeliciou 666...
      • youlookdeliciou:4G环境下无法调起微信支付呀.是这个获取IP的方法不对吗?
      • 8636ffac27f8:大神 我在前端生成的信息, 签名验证的时候 签名和后台的不一样,为什么?
      • 8636ffac27f8:操作都放服务器端的试过了么
        华之曦: @蓝翔技校杰出校友 比对一下,前后台用的appid或者secret是否一致,
        8636ffac27f8:@华之曦 大神 我在前端生成的信息, 签名验证的时候 签名和后台的不一样,为什么?
        华之曦: @蓝翔技校杰出校友 没有,那样是比较合理的放后台。
      • 8e35accd9651:MD5里边引入的Contast.h文件找不到
      • 卡农forever_love:The certificate used to sign "WXPayDemo" has either expired or has been revoked. An updated certificate is required to sign and install the application. 跑ioS10真机上证书没有用了
        华之曦: @卡农forever_love ios10我这边还没有走过,改天趟一趟。
      • 孙公瑾i:楼主,我这边后台处理的订单,吊起微信的时候提示 支付验证签名失败 是什么原因?安卓正常
        孙公瑾i:@华之曦 后台处理的预订单,安卓正常 ios 签名验证失败,用校验工具校验过了,也是正常
        华之曦:@孙公瑾i 有在DataMD5.m里面配置WX_PartnerKey么?
      • 8636ffac27f8:大神 有几个问题 mch_id 是app只有一个,还是app里的不同商家的mch_id 不同? 还有就是支付后 钱是到了开发app的公司里,还是直接给到app里的商家?
        8636ffac27f8:额 我懂了, 和appID 一样
        8636ffac27f8:@华之曦 意思就是 商户号 只有一个么,支付时候用的商户号都是同一个?
        华之曦:@蓝翔技校杰出校友 上面写的有注释了不是,是商户号,支付后钱到商户号里面,商家。
      • 238fdc668e37:将stand(time(0))改为srand((unsigned)time(0))就不会有警告了 :smile:
        华之曦:@vigrance贾晓玉 谢谢, :smiley:
        8636ffac27f8:@vigrance贾晓玉 大神 有几个问题 mch_id 是app只有一个,还是app里的不同商家的mch_id 不同? 还有就是支付后 钱是到了开发app的公司里,还是直接给到app里的商家?
      • 蒋昉霖:为何订单状态加密等信息要放到前段,我支付成功了直接后台了,后端订单状态能改变?
        华之曦:@蒋昉霖 也是,存在你说的这种业务场景。可以一起想下方案,谢谢哦。 :grin:
        蒋昉霖:我的意思是,你把啥都放到前端,支付成功直接home 键全部进入后台,根本收不到回调,你怎么通知后台订单信息
        华之曦:@蒋昉霖 支付成功走回调,往后台发送支付过的订单信息呗。
      • 95e764559ca9:您好,你发的微信支付SDK有的MD5还有解析XML是你自己写的吧?
        华之曦:@秋雨寒路人 不是的,下载的。
      • 95e764559ca9: out_trade_no = self.gold_sn;
        商户订单号是从后台获取的,但是每个单子都有自己的out_trade_no,统一支付的应该填哪一个?
      • 64299eb6b9ff:大神 给个Demo吧 感谢 邮箱: 513433750@qq.com
      • 马什么梅:你好 post的那个网址https://api.mch.weixin.qq.com/pay/unifiedorder是怎么来的呢 里面有几个参数的 我没网址 参数是自己填的么
        华之曦:@马什么梅 - (void)http:(NSString *)xml这个方法里面的东西你不用动的,只需要在上面的方法填写支付信息。
        马什么梅:@Huazhixi 官方demo就是给了个网址 里面有6个参数吧 我不是那个意思 我们公司有appid 另外5个参数啥的自己填 还是后台做成微信给的那种网址一样 后台就给了个appid token appsecret 啊
        华之曦:@马什么梅 那是调取微信后台然后返回相关参数用来加密的,属于官方的内容,你可以下载官方Demo看下。
      • 8e5adc8130c4:大神,,那个友盟分享的WX_appID和微信支付使用的WX_appID是一样的吗
      • 7e5ed2c6e212:大神 你的百度云过期了是么 我想问一下 如果只是简单的实现支付 直接 [WXApi sendReq: request];是不是就可以了? (request里面包含商家id,支付订单,数据和签名,随机字符串,时间戳,商家制作的签名) :pray: 望回复 好人一生平安
        华之曦:@孙长老快收了神通吧 百度云里面的东西都没有了,郁闷了。我再重新上传一份。
      • 骑毛驴的小强:srand( (unsigned)time(0) );
      • 兔小七: [manager.requestSerializer setValue:@"https://api.mch.weixin.qq.com/pay/unifiedorder&quot; forHTTPHeaderField:@"SOAPAction"];
        [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
        return xml;
        }];

        能说一下为什么要设置这两个吗?有什么作用?
        华之曦:@兔小七 第一个应该是设置请求头的类型的,第二个设置返回的数据类型。
        这是我的猜测,你最好去搜下吧,朋友。
      • Pusswzy:{xml=<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wx772431aedf9e2cc5]]></appid><mch_id><![CDATA[1276593901]]></mch_id><nonce_str><![CDATA[AihLlwREhKjEsHnJ]]></nonce_str><sign><![CDATA[1339C5C5A78AF70E7ED67D0075290034]]></sign><result_code><![CDATA[SUCCESS]]></result_code><prepay_id><![CDATA[wx20160729165742842e75f48f0674128724]]></prepay_id><trade_type><![CDATA[APP]]></trade_type></xml>} 这是后台返回的数据 无法解析, 我怀疑是CDATA的原因 导致无法用XMLDictionary解析出来
        Pusswzy:@Huazhixi 把xml= 就可以正常解析了.
        华之曦:@Pusswzy 这是通过微信返回的内容,不是你们后台返回的啦。

      • Pusswzy:dictionaryWithXMLString 请问怎么解析XML的
        Pusswzy:@Huazhixi 请问您XMLDictionary 这个类是哪里的
        Pusswzy:@Huazhixi 我今天做不出来 可能就延时了 , 都没想到您能回复我 谢谢您
        华之曦:@Pusswzy 有这个类XMLDictionary,这个是类库里面带的,直接用就了了呀。
      • PittWong:不错 先做知识储备,过阶段会加支付功能,到时候用
        华之曦:@PittWong 建议用ping++的,嘿嘿,简单方便。
      • 回味岁月:我们这边后台也没做 要全接到前面 能不能给个你接过的Demo学习一下 330685809@qq.com 多谢了
        华之曦:@回味岁月 代码都在上面的,放到代码中就应该差不多了。
      • c652de5c70a8:Good 3Q
        华之曦:@手机用户2699850030 :grin:
      • Raybon_lee:你的左上角返回系统回调怎么处理的
        华之曦: @Raybon_lee 在回调方法里面,发送通知。
        Raybon_lee:@Huazhixi 是用notifyurl再从服务器发到客户端,具体怎么说,这个目前遇到一点小问题
        华之曦: @Raybon_lee 发送支付结果。
      • 超级英雄悟空:帅哥,按照你的步骤来的,真机调试的时候打印日志说参数不正确,支付错误,微信根本就没进去,什么情况???
        华之曦:@超级英雄悟空 哥们儿,你应该会断点+log查看错误的吧,我这没有你的代码也没法儿看。
        超级英雄悟空:@Huazhixi responseString is <?xml version="1.0" encoding="UTF-8" standalone="yes"?><xml><return_code></return_code><return_msg></return_msg></xml>
        2016-06-01 14:47:20.997 微信支付[1028:380898] 参数不正确,请检查参数
        华之曦:@超级英雄悟空 Log出来的信息是什么呢?
      • 杨空空:问一下 那个appkey 是什么
        华之曦: @杨空空 上面写着注释呢,哥们儿。
        杨空空:@Huazhixi 就是微信支付 需要的几个key 和密钥 。
        华之曦: @杨空空 能在具体些不?
      • 443b90daef82:md5 那个文件有哪些方法啊?
        华之曦:@丶好久没换了 难道例子中的方法不够用么?
      • time_xie:为什么我在官网下载的的demo运行不了,不会调用微信,直接告诉我支付失败。。
        华之曦:@凄凄切切111111 里面需要修改参数,2-4的配图。
      • 小樊:为什么我前端生成的sign 和 微信提供的测试接口 显示的 sign 是一样的, 但是发送请求返回的一直是签名错误呢? 求指点
        华之曦:@小樊 嗯。
        小樊:@Huazhixi 重设我的商户API key 就OK 了,也没改,不知道为什么...
        警告 : srand((unsigned)time(0)); 这样就没了,你试试
        华之曦:@小樊 替换过自己的WX_appID和WX_AppSecret没?
      • 回忆里的我:你好,能不能发个DEMO?
        华之曦:@回忆里的我 哥们儿,点“微信支付SDK”,那是个分享链接啊,你去下载下吧。
        回忆里的我:哪个DataMD5文件能发我嘛?
        华之曦:@回忆里的我 你是卡到哪里了还是说没有做的?建议你用Ping++,来做支付环节。
      • 燕学森:我把sign加密后发现和后台返回来的sign还是一样的。。。。可是我的回到微信还是只有一个确定。。。。。返回后是参数错误。。。。请大神给我讲一下。。。多谢多谢!
        华之曦:@燕学森 第4步里面,有更换成自己的key么?
      • 110f4def03f8:商户密钥最新版的好像不需要了吧
        我的左侧隔银河:@Huazhixi 兄弟 那我想问一下 如果后台完成签名什么的 前端还需要签名么~
        我的左侧隔银河:@Huazhixi 哦哦 get新技能
        华之曦:@我却没能留你 如果是在前端完成订单生成和二次签名应该是不可少的。

      本文标题:iOS应用之微信支付集成

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