Skip to content

  • Home
  • Archives
  • Tools
  • Links
  • Guest
  • About

Let's whisper

所有随风而逝的,都属于昨天的,所有经历风雨留下来的,才是面向未来的。

  • 程序开发
    • PHP
    • Python
    • HTML/CSS
    • JavaScript
    • 服务器
    • 数据库
    • 微信开发
    • 区块链
    • 作品展示
  • 应用程序
    • 开发工具
    • 操作系统
    • 桌面应用
    • 移动应用
    • 网页应用
  • WordPress
  • 探索发现
    • 音乐
    • 影视
    • 图像
    • 资讯
    • 设计创意
    • 新技能
  • 个人日志

Home 程序开发 微信开发 解决 ApiCloud 开发的 APP 微信支付闪退问题

解决 ApiCloud 开发的 APP 微信支付闪退问题

2018/03/27 5,146

前言

该 APP 基于 ApiCloud 开发,出现的问题是:在 iOS 端,提交订单后点击微信支付 APP 闪退,支付宝支付无问题,Android 端也没有问题。

准备开发和调试环境

我本机没有 ApiCloud 的开发环境,需要安装一个。使用的是 WebStrom 和 WebStorm APICloud 插件。

一、安装 WebStorm APICloud 插件

按照 ApiCloud 文档 安装 WebStorm 插件,对了,我用的是 Win10。

举个例子:

安装"ios真机同步"插件。在 'External Tools'选项中,点击 '+' 。在Create Tool中,填写如下内容:

name : ios真机同步 Program : java Parameters : -jar \$ProjectFileDir\$/webStorm-APICloud/webStorm_loader.jar \$ProjectFileDir\$/webStorm-APICloud/ \$FileDir\$ ios

安装好之后,右键点击 工作空间(文件夹) -> 弹出菜中选择 'External Tools' -> 根据需要选择相应的插件。这里报错:

Error running 'ios本地打包': Cannot run program "java" (in directory "D:\www\uuhui"): CreateProcess error=2, 系统找不到指定的文件。

是因为我没有 Java 环境,我安装 WebStorm 时安装了 JDK,但是没有添加到环境变量中。如果不想添加环境变量,在 'External Tools'选项中把 Program 中的 java 改成绝对路径即可:

C:\Program Files\JetBrains\WebStorm 2017.3.5\jre64\bin\java.exe

二、安装 WebStorm WiFi 真机同步插件

参照 官方文档 安装即可。值得注意的是需要关闭 Win10 的防火墙,手机才能连接成功。

三、安装WiFi日志输出插件

安装日志输出插件才能定位闪退的问题。按照 官方文档 安装:

把插件包中 wifilog.jar 放到目录C:\APICloud\workspace 下。

在 Settings-Tools-Terminal 面板配置如图所示内容:

cmd.exe /K "chcp 936 && java -jar C:/APICloud/workspace/wifilog.jar C:/APICloud/workspace/log_info"

按快捷键 Alt+F12启动WiFi日志输出。有些键盘可能需要同时按fn键。

又报错了:

Can't Open Local Terminal java.io.IOException: Couldn't create PTY

把 cmd 和 java 的路径都改为绝对路径即可:

"C:\Windows\System32\cmd.exe"  /K "chcp 936 && "C:\Program Files\JetBrains\WebStorm 2017.3.5\jre64\bin\java.exe" -jar C:/APICloud/workspace/wifilog.jar C:/APICloud/workspace/log_info"

定位和解决问题

终于进入正题,手机上安装 AppLoader (下载地址), 连接电脑端进行真机同步,测试支付。不出意料,点击微信支付时闪退,同时捕获到了日志:

    03-26 16:02:37.524 E/app3c   (1): Exception name:NSSignalException
    Exception reason:Signal SIGABRT was raised!
    Exception stack:(
            0   UZApp                               0x0000000102de0f68 UZApp + 823144,
            1   UZApp                               0x0000000102de0b00 UZApp + 822016,
            2   libsystem_platform.dylib            0x0000000182dafb40 _sigtramp + 36,
            3   libsystem_pthread.dylib             0x0000000182db52f8  + 396,
            4   libsystem_c.dylib                   0x0000000182c0efbc abort + 140,
            5   libc++abi.dylib                     0x00000001823ac068 __cxa_bad_cast + 0,
            6   libc++abi.dylib                     0x00000001823c4568  + 44,
            7   libc++abi.dylib                     0x00000001823c4158 __cxa_rethrow + 144,
            8   libobjc.A.dylib                     0x00000001823d46e8 objc_exception_rethrow + 44,
            9   CoreFoundation                      0x0000000183050cc4 CFRunLoopRunSpecific + 544,
            10  GraphicsServices                    0x0000000184efcf84 GSEventRunModal + 100,
            11  UIKit                               0x000000018c7a95c4 UIApplicationMain + 236,
            12  UZApp                               0x0000000102de81ac UZApp + 852396,
            13  libdyld.dylib                       0x0000000182b7056c  + 4
    )

通过搜索报错信息,在官方论坛上的 这个帖子 看到了一样的问题:

原来是nonce_str 传成数字类型了。我用的当前时间戳。这个nonce_str 必须要字符串类型。给以后遇到这个问题的人留一个解决思路。

原来是格式问题,通过 Surge 抓包看了下服务端返回的数据(已打马赛克):

{
    "errno": 0,
    "message": "",
    "data": {
        "appid": "wx13af8XXXXXX",
        "noncestr": "OsiLIttL",
        "package": "Sign=WXPay",
        "partnerid": 148000000,
        "prepayid": "wx20180326165311f3eefe5a000000000",
        "timestamp": 1522054391,
        "paySign": "DBB418114528C06326DF14109EDBFA91"
    }
}

从返回的 json 数据中可以看出 partnerid 和 timestamp 都为 int 型,iOS 端必须为 String 才可以。在服务端强制转换输出类型为 String 即可。修改后的正确返回数据应该如下:

{
    "errno": 0,
    "message": "",
    "data": {
        "appid": "wx13af8XXXXXX",
        "noncestr": "OsiLIttL",
        "package": "Sign=WXPay",
        "partnerid": "148000000",
        "prepayid": "wx20180326165311f3eefe5a000000000",
        "timestamp": "1522054391",
        "paySign": "DBB418114528C06326DF14109EDBFA91"
    }
}

至此破案。

彩蛋一枚

ApiCloud 官方的 WebStorm 插件中没有打包成 Widget 功能,在论坛里找到了一个自动压缩打包成Widget的插件。

  1. 下载扩展文件,存放在 webStorm-APICloud\tools 目录下
  2. 在 WebStorm 的 Settings > tools > Externel Tools,点击 '+' 。在Create Tool中,填写如下内容:

name : 创建Widget包 Program : cmd Parameters : /C \$ProjectFileDir\$\webStorm-APICloud\tools\WebStormCompressWidget.exe \$FileDir\$ Working directory: \$FileDir\$

附:插件下载

Posted in 微信开发   Tagged ApiCloud, APP, Debug, WebStorm, 微信应用开发

恰克

本页链接: https://miu.im/?p=818

最近更新: 2020/12/24

Previous Post: 搭建基于以太坊的私有链环境
Next Post: 区块链投资

Primary Sidebar

相关文章

  • 微信公众号使用带参数永久二维码超过10万个会怎样?
  • PHPExcel 在 PHP 7+ 下无法使用的问题
  • 调试微信授权的页面
  • Android 版 Chrome 前端调试方案

近期文章

  • 您好,2021
  • max_input_vars
  • 提升效率的几个 VSCode 快捷键
  • TA-Lib Installation
  • iPhone 使用的几个小技巧
  • 再次回归
  • Visual Studio Code disable auto wrap long line
  • KeePass 复制条目到另一个数据库
  • Chrome DevTools 小技巧两则
  • 区块链投资
Loading

功能

  • 登录
  • 条目feed
  • 评论feed
  • WordPress.org

Copyright © 2009-2023 Let's whisper. Powered by WordPress and Stargazer.