欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

新版Android studio导入微信支付和支付宝官方Demo问题解决大全

程序员文章站 2024-03-05 10:31:48
最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者beecloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥、私钥和appid...

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

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

微信开放平台有文档和sdk,大家可以去自己查看下载,火箭: 

支付宝官方的demo和文档相对简单些,而且说的更清楚些,火箭:

还是先看下运行的demo图示:
首先是微信的

新版Android studio导入微信支付和支付宝官方Demo问题解决大全 

再看看支付宝的

新版Android studio导入微信支付和支付宝官方Demo问题解决大全 

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

 新版Android studio导入微信支付和支付宝官方Demo问题解决大全 

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

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

然后修改后try again   oh,no,又来一个什么鬼。 

新版Android studio导入微信支付和支付宝官方Demo问题解决大全

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

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

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

compilesdkversion 23
 buildtoolsversion "24.0.0"
 aaptoptions.cruncherenabled = false
 aaptoptions.usenewcruncher = false

 defaultconfig {
  applicationid "net.sourceforge.simcpux"
  minsdkversion 4
  targetsdkversion 23
}

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

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

新版Android studio导入微信支付和支付宝官方Demo问题解决大全

哦,原来是因为6.0以后官方隐藏的httpclient的相关api,然而大多数导入的代码都还用着这个强大的框架,那怎么弄呢?
好的,只需要再在gradle文件中添加这样的一句话就好

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

dependencies {
 compile files('libs/libammsdk.jar')

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

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

 新版Android studio导入微信支付和支付宝官方Demo问题解决大全

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

oh on,直接崩溃

 新版Android studio导入微信支付和支付宝官方Demo问题解决大全

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

新版Android studio导入微信支付和支付宝官方Demo问题解决大全

空指针异常?进去一看
 sign = urlencoder.encode(sign, "utf-8");

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

/**
  * sign the order info. 对订单信息进行签名
  * 
  * @param content
  *   待签名订单信息
  */
 private string sign(string content) {
  return signutils.sign(content, rsa_private);
 }

这个方法的问题,这样返回的是一个空的。
 再进去一看

public static string sign(string content, string privatekey) {
  try {
   pkcs8encodedkeyspec pripkcs8 = new pkcs8encodedkeyspec(
     base64.decode(privatekey));
   keyfactory keyf = keyfactory.getinstance(algorithm);
   privatekey prikey = keyf.generateprivate(pripkcs8);

   java.security.signature signature = java.security.signature
     .getinstance(sign_algorithms);

   signature.initsign(prikey);
   signature.update(content.getbytes(default_charset));

   byte[] signed = signature.sign();

   return base64.encode(signed);
  } catch (exception e) {
   e.printstacktrace();
  }

  return null;
 }

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

/**
  * sign the order info. 对订单信息进行签名
  * 
  * @param content
  *   待签名订单信息
  */
 private string sign(string content) {
//  return signutils.sign(content, rsa_private);
  return rsa_private;
}

修改一下,再次运行。oh yeah,成功!
今天就讲这么多,有啥不懂的,还是运用万能的百度吧!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。