zoukankan      html  css  js  c++  java
  • 解决新版Android studio导入微信支付和支付宝官方Demo的问题

    最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥、私钥和APPID等,所以就用下开放平台的呗。

    进去倒腾了半天才发现一堆问题,Oh,我的天。完全不知所云,百度谷歌了一堆,都没找到足够的解决方案。好吧,自己来,这里也就把相关的东西分享给大家,如果有类似问题的可以考虑使用一下,不足的地方大牛就别喷了。

    微信开放平台有文档和SDK,大家可以去自己查看下载,火箭:https://open.weixin.qq.com/

    支付宝官方的Demo和文档相对简单些,而且说的更清楚些,火箭:https://open.alipay.com/platform/home.htm

    还是先看下运行的Demo图示:

    首先是微信的

    再看看支付宝的

    点击支付会跳转到你手机上的支付宝APP,如果手机上没有下载也是可以用的,不过用的不在一个真正的支付宝APP中

     但是这么简单的东西,楼主的确智商捉急,都弄了半天。

    首先是导入微信的Demo,去官方下载了SimpleDemo后,发现一堆错误,好吧,首先是SDK的问题,这个就不多做赘述了。

    然后修改后Try Again   oh,no,又来一个什么鬼。

    什么鬼,仔细一看,是drawable里面有不是png的文件命名成了png文件。

    好吧,如果你足够的耐心,那么几十张图片,你还是可以直接一张一张的检查后缀的,看看有不是png作为后缀的,另存一下,或者修改你的文件名使其和后缀名一致。

    然而程序员的能力应该体现在偷懒的程度上,所以容我偷懒啦。

     1 compileSdkVersion 23
     2     buildToolsVersion "24.0.0"
     3     aaptOptions.cruncherEnabled = false
     4     aaptOptions.useNewCruncher = false
     5 
     6     defaultConfig {
     7         applicationId "net.sourceforge.simcpux"
     8         minSdkVersion 4
     9         targetSdkVersion 23
    10     }

    只需要在对应的gradle文件中加上两句话 ,并把值至为false即可。

    再次Try again, oh ,no,这次是一大堆错误,什么鬼!看一看日志。

    哦,原来是因为6.0以后官方隐藏的HttpClient的相关API,然而大多数导入的代码都还用着这个强大的框架,那怎么弄呢?

    好的,只需要再在Gradle文件中添加这样的一句话就好

    android {
            useLibrary 'org.apache.http.legacy'
        }

    1 dependencies {
    2     compile files('libs/libammsdk.jar')
    3 
    4     android {
    5         useLibrary 'org.apache.http.legacy'
    6     }
    7 }

    再来看看支付宝的,就简单多了。我遇到的第一个问题是,没有指定APPID,公钥那些东西,好的,这个肯定是得弄得,把自己申请的一系列东西装进去。

    运行一看。

    嘿嘿,有界面,应该可以吧,点击一下支付。

    Oh on,直接崩溃

    错也总得有原因哈,看看日志。

    空指针异常?进去一看

    1 sign = URLEncoder.encode(sign, "UTF-8");

    是这样一句话出现了问题,这句话什么问题呢。

    1     /**
    2      * sign the order info. 对订单信息进行签名
    3      * 
    4      * @param content
    5      *            待签名订单信息
    6      */
    7     private String sign(String content) {
    8         return SignUtils.sign(content, RSA_PRIVATE);
    9     }

    这个方法的问题,这样返回的是一个空的。

    再进去一看

     1 ublic static String sign(String content, String privateKey) {
     2         try {
     3             PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
     4                     Base64.decode(privateKey));
     5             KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);
     6             PrivateKey priKey = keyf.generatePrivate(priPKCS8);
     7 
     8             java.security.Signature signature = java.security.Signature
     9                     .getInstance(SIGN_ALGORITHMS);
    10 
    11             signature.initSign(priKey);
    12             signature.update(content.getBytes(DEFAULT_CHARSET));
    13 
    14             byte[] signed = signature.sign();
    15 
    16             return Base64.encode(signed);
    17         } catch (Exception e) {
    18             e.printStackTrace();
    19         }
    20 
    21         return null;
    22     }

    是这样的一串代码,原来这个方法是把私钥转换成应该有的格式,而我公司给的意见转换好了,好吧。

    那直接返回就成了呗

     1 /**
     2      * sign the order info. 对订单信息进行签名
     3      * 
     4      * @param content
     5      *            待签名订单信息
     6      */
     7     private String sign(String content) {
     8 //        return SignUtils.sign(content, RSA_PRIVATE);
     9         return RSA_PRIVATE;
    10     }

    修改一下,再次运行。Oh yeah,成功!

    今天就讲这么多,有啥不懂的,还是运用万能的百度吧!





  • 相关阅读:
    软件项目管理实践之日计划
    VB.NET版机房收费系统—数据库设计
    图的邻接矩阵存储结构
    Java多态特性:重载和覆写的比較
    《实体解析与信息质量》
    cocos2d-x lua 中使用protobuf并对http进行处理
    Memcached 笔记与总结(2)编译 php-memcache 扩展
    大数据的时代意义
    大数据的时代意义
    SPSS输出结果统计表与统计图的专业性编辑及三线表定制格式
  • 原文地址:https://www.cnblogs.com/liushilin/p/5708596.html
Copyright © 2011-2022 走看看