解決新版Android studio導入微信支付和支付寶官方Demo的問題

最近項目要用到支付寶支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,可是因爲他們的收費問題,讓我望而卻步,並且公司給了相應的公鑰、私鑰和APPID等,因此就用下開放平臺的唄。java

進去倒騰了半天才發現一堆問題,Oh,個人天。徹底不知所云,百度谷歌了一堆,都沒找到足夠的解決方案。好吧,本身來,這裏也就把相關的東西分享給你們,若是有相似問題的能夠考慮使用一下,不足的地方大牛就別噴了。android

微信開放平臺有文檔和SDK,你們能夠去本身查看下載,火箭:https://open.weixin.qq.com/程序員

支付寶官方的Demo和文檔相對簡單些,並且說的更清楚些,火箭:https://open.alipay.com/platform/home.htmapache

 

仍是先看下運行的Demo圖示:微信

首先是微信的app

 

再看看支付寶的框架

點擊支付會跳轉到你手機上的支付寶APP,若是手機上沒有下載也是能夠用的,不過用的不在一個真正的支付寶APP中微信支付

 

 

 可是這麼簡單的東西,樓主的確智商捉急,都弄了半天。gradle

 

首先是導入微信的Demo,去官方下載了SimpleDemo後,發現一堆錯誤,好吧,首先是SDK的問題,這個就很少作贅述了。ui

而後修改後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,成功!

 

今天就講這麼多,有啥不懂的,仍是運用萬能的百度吧!

相關文章
相關標籤/搜索