Android App集成支付寶

原地址:http://blog.csdn.net/wenbingoon/article/details/7933078php

手機的在線支付,被認爲是2012年最看好的功能,我我的認爲這也是移動互聯網較傳統互聯網將會大放光彩的一個功能。
人人有手機,人人攜帶手機,花錢買東西,再也不須要取錢付現,再也不須要回家上網銀,想買什麼,掃描一下,或者搜索一下,而後下單,不找零,直接送到你家,這將是手機支付給咱們帶來的全新交易體驗。
谷歌剛推出了谷歌錢包,這必是咱們後面要使用的主要手段,可是鑑於當前國情,我以爲有必要介紹一下android手機集成支付寶功能。 html

1.下載官方架包和說明文檔
其實官方已經提供了安裝指南,下載地址:
https://mobiless.alipay.com/product/product_down_load.htm?code=SECURITY_PAY
裏面有有個pdf,詳細說明了說用指南,寫的比較詳細,能夠重點參考。java


下載下來,咱們主要是用到Android(20120104)目錄下的alipay_plugin.jar和AppDemo/assets下的alipay_plugin223_0309.apk,這兩個文件是咱們不能修改的支付寶api和安裝包。android

2. 商戶簽約
如今的安全機制,都是這樣,客戶端須要先和服務端請求驗證後才能進行進一步操做,oauth也是如此。
打開https://ms.alipay.com/,登錄支付寶,點擊簽約入口,選擇"應用類產品",填寫並等待審覈,獲取商戶ID和帳戶ID。
簽約的時候還要向須要提供實名認證和上傳應用,因此我建議先把應用作好了,最後再集成支付寶。算法


我大概等了1-2天審覈,審覈是失敗的,回覆是應用類型啥的應該是"虛擬貨幣",我改爲那個立刻自動就審覈經過了。api

3.密鑰配置
解壓openssl-0.9.8k_WIN32(RSA密鑰生成工具).zip,打開cmd,命令行進入openssl-0.9.8k_WIN32(RSA密鑰生成工具)\bin目錄下,
(1).執行數組

?
1
openssl genrsa  -out rsa_private_key.pem 1024

生成rsa_private_key.pem文件。
(2).再執行安全

?
1
openssl rsa  -in rsa_private_key.pem  -pubout -out rsa_public_key.pem

生成rsa_public_key.pem 文件。
(3).在執行服務器

?
1
openssl pkcs8  -topk8  -inform PEM  -in rsa_private_key.pem  -outform PEM  -nocrypt

將RSA私鑰轉換成 PKCS8 格式,去掉begin和end那兩行,把裏面的內容拷貝出來,保存到某個txt中,如rsa_private_pkcs8_key.txt中(我好像沒用到這個)。
打開rsa_public_key.pem,即商戶的公鑰,複製到一個新的TXT中,刪除文件頭」-----BEGIN PUBLIC KEY-----「與文件尾」-----END PUBLIC KEY-----「還有空格、換行,變成一行字符串並保存該 TXT 文件,而後在網站的「個人商家服務」切換卡下的右邊點擊「密鑰管理」,而後有個"上傳商戶公鑰(RSA)"項,選擇上傳剛纔的TXT文件.
好了,服務器配置OK,由於這一段以前沒有截圖,如今弄好了又很差截圖,若是有不明白的地方請你們參考官方文檔。 app

4.引用jar和包含安裝包
    (1).新建android工程;
    (2).copy上面說的alipay_plugin.jar到工程的libs目錄下,並在java build path中經過Add External JARs找到並引用該jar;
    (3).copy上面說的alipay_plugin223_0309.apk安裝包到assets目錄下,後面配置路徑用到。

若是libs和assets目錄沒有,手動創建者兩個目錄。

5.調用代碼整理
這裏咱們要嚴重的參考文檔中AppDemo,咱們建一個包com.tianxia.lib.baseworld.alipay,把AppDemo的com.alipay.android.appDemo4包下的源碼所有copy到剛纔咱們本身的包下,還有res目錄下的資源文件也合併到咱們工程res下。
其中AlixDemo.java,ProductListAdapter.java,Products.java是示例類,咱們借鑑完後能夠刪除。
PartnerConfig.java是配置類,配置商戶的一些配置參數。
其餘的類是嚴重參考類,直接留下使用。
PartnerConfig.java代碼以下:

?
1
2
3
4
5
6
7
8
9
10
11
12
public  class  PartnerConfig {
     //合做商戶ID。用簽約支付寶帳號登陸ms.alipay.com後,在帳戶信息頁面獲取。
     public  static  final  String PARTNER =  "xxx" ;
     //帳戶ID。用簽約支付寶帳號登陸ms.alipay.com後,在帳戶信息頁面獲取。
     public  static  final  String SELLER =  "xxx" ;
     //商戶(RSA)私鑰 ,即rsa_private_key.pem中去掉首行,最後一行,空格和換行最後拼成一行的字符串
     public  static  final  String RSA_PRIVATE =  "xxx" ;
     //支付寶(RSA)公鑰  用簽約支付寶帳號登陸ms.alipay.com後,在密鑰管理頁面獲取。
     public  static  final  String RSA_ALIPAY_PUBLIC =  "xxx" ;
     //下面的配置告訴應用去assets目錄下找安裝包
     public  static  final  String ALIPAY_PLUGIN_NAME = "alipay_plugin223_0309.apk" ;
}

AlixDemo中代碼是最終的調用代碼在onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {}中,下面咱們提取其中的核心代碼。

6.提取核心調用代碼
在AlixDemo.java同目錄下新建AlixPay.java,來提取AlixDemo.java的核心代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
package  com.tianxia.lib.baseworld.alipay;
 
import  java.net.URLEncoder;
import  java.text.SimpleDateFormat;
import  java.util.Date;
 
import  com.tianxia.lib.baseworld.R;
 
import  android.app.Activity;
import  android.app.ProgressDialog;
import  android.content.DialogInterface;
import  android.os.Handler;
import  android.os.Message;
import  android.view.KeyEvent;
import  android.widget.Toast;
 
public  class  AlixPay {
 
     static  String TAG =  "AlixPay" ;
 
     private  Activity mActivity;
     public  AlixPay(Activity activity) {
         mActivity = activity;
     }
 
     private  ProgressDialog mProgress =  null ;
 
     // the handler use to receive the pay result.
     private  Handler mHandler =  new  Handler() {
         public  void  handleMessage(Message msg) {
             try  {
                 String strRet = (String) msg.obj;
 
                 switch  (msg.what) {
                 case  AlixId.RQF_PAY: {
 
                     closeProgress();
 
                     BaseHelper.log(TAG, strRet);
 
                     try  {
                         String memo =  "memo=" ;
                         int  imemoStart = strRet.indexOf( "memo=" );
                         imemoStart += memo.length();
                         int  imemoEnd = strRet.indexOf( ";result=" );
                         memo = strRet.substring(imemoStart, imemoEnd);
 
                         ResultChecker resultChecker =  new  ResultChecker(strRet);
 
                         int  retVal = resultChecker.checkSign();
                         if  (retVal == ResultChecker.RESULT_CHECK_SIGN_FAILED) {
                             BaseHelper.showDialog(
                                     mActivity,
                                     "提示" ,
                                     mActivity.getResources().getString(
                                             R.string.check_sign_failed),
                                     android.R.drawable.ic_dialog_alert);
                         else  {
                             BaseHelper.showDialog(mActivity,  "提示" , memo,
                                     R.drawable.infoicon);
                         }
                         
                     catch  (Exception e) {
                         e.printStackTrace();
 
                         BaseHelper.showDialog(mActivity,  "提示" , strRet,
                                 R.drawable.infoicon);
                     }
                 }
                     break ;
                 }
 
                 super .handleMessage(msg);
             catch  (Exception e) {
                 e.printStackTrace();
             }
         }
     };
 
     // close the progress bar
     void  closeProgress() {
         try  {
             if  (mProgress !=  null ) {
                 mProgress.dismiss();
                 mProgress =  null ;
             }
         catch  (Exception e) {
             e.printStackTrace();
         }
     }
 
     public  void  pay() {
         MobileSecurePayHelper mspHelper =  new  MobileSecurePayHelper(mActivity);
         boolean  isMobile_spExist = mspHelper.detectMobile_sp();
         if  (!isMobile_spExist)
             return ;
 
         if  (!checkInfo()) {
             BaseHelper.showDialog(mActivity,  "提示" ,
                     "缺乏partner或者seller," , R.drawable.infoicon);
             return ;
         }
 
         try  {
             // prepare the order info.
             String orderInfo = getOrderInfo();
             String signType = getSignType();
             String strsign = sign(signType, orderInfo);
             strsign = URLEncoder.encode(strsign);
             String info = orderInfo +  "&sign="  "\""  + strsign +  "\""  "&"
                     + getSignType();
             
             // start the pay.
             MobileSecurePayer msp =  new  MobileSecurePayer();
             boolean  bRet = msp.pay(info, mHandler, AlixId.RQF_PAY, mActivity);
             
             if  (bRet) {
                 // show the progress bar to indicate that we have started paying.
                 closeProgress();
                 mProgress = BaseHelper.showProgress(mActivity,  null "正在支付" false ,
                         true );
             else
                 ;
         catch  (Exception ex) {
             Toast.makeText(mActivity, R.string.remote_call_failed,
                     Toast.LENGTH_SHORT).show();
         }
         
     }
 
     private  boolean  checkInfo() {
         String partner = PartnerConfig.PARTNER;
         String seller = PartnerConfig.SELLER;
         if  (partner ==  null  || partner.length() <=  0  || seller ==  null
                 || seller.length() <=  0 )
             return  false ;
 
         return  true ;
     }
 
 
     // get the selected order info for pay.
     String getOrderInfo() {
         String strOrderInfo =  "partner="  "\""  + PartnerConfig.PARTNER +  "\"" ;
         strOrderInfo +=  "&" ;
         strOrderInfo +=  "seller="  "\""  + PartnerConfig.SELLER +  "\"" ;
         strOrderInfo +=  "&" ;
         strOrderInfo +=  "out_trade_no="  "\""  + getOutTradeNo() +  "\"" ;
         strOrderInfo +=  "&" ;
         //這筆交易價錢
         strOrderInfo +=  "subject="  "\""  + mActivity.getString(R.string.donate_subject) +  "\"" ;
         strOrderInfo +=  "&" ;
         //這筆交易內容
         strOrderInfo +=  "body="  "\""  + mActivity.getString(R.string.donate_body) +  "\"" ;
         strOrderInfo +=  "&" ;
         //這筆交易價錢
         strOrderInfo +=  "total_fee="  "\""  "10.00"  "\"" ;
         strOrderInfo +=  "&" ;
         strOrderInfo +=  "notify_url="  "\""
                 "http://notify.java.jpxx.org/index.jsp"  "\"" ;
 
         return  strOrderInfo;
     }
 
     // get the out_trade_no for an order.
     String getOutTradeNo() {
         SimpleDateFormat format =  new  SimpleDateFormat( "MMddHHmmss" );
         Date date =  new  Date();
         String strKey = format.format(date);
 
         java.util.Random r =  new  java.util.Random();
         strKey = strKey + r.nextInt();
         strKey = strKey.substring( 0 15 );
         return  strKey;
     }
 
     // get the sign type we use.
     String getSignType() {
         String getSignType =  "sign_type="  "\""  "RSA"  "\"" ;
         return  getSignType;
     }
 
     // sign the order info.
     String sign(String signType, String content) {
         return  Rsa.sign(content, PartnerConfig.RSA_PRIVATE);
     }
 
     // the OnCancelListener for lephone platform.
     static  class  AlixOnCancelListener  implements
             DialogInterface.OnCancelListener {
         Activity mcontext;
 
         AlixOnCancelListener(Activity context) {
             mcontext = context;
         }
 
         public  void  onCancel(DialogInterface dialog) {
             mcontext.onKeyDown(KeyEvent.KEYCODE_BACK,  null );
         }
     }
}

這個類的pay方法就是支付的方法,最簡單的不設置的話,調用方法以下:

?
1
2
AlixPay alixPay =  new  AlixPay(SettingTabActivity. this );
alixPay.pay();

若是沒有安裝支付寶,它會提示你安裝,若是已經安裝,它直接讓你選擇付款:

這說明已經配置成功了。
而後能夠刪掉那些示例java文件了: AlixDemo.java,ProductListAdapter.java,Products.java。 
你也能夠經過調整參數來修改訂單信息,如主題,價格等。
另外在BaseHelper的94行:

?
1
dialog.setOnCancelListener(  new  AlixDemo.AlixOnCancelListener( (Activity)context ) );

須要修改成:

?
1
dialog.setOnCancelListener(  new  AlixPay.AlixOnCancelListener( (Activity)context ) );

7.注意
我在測試的時候,調用的activity是框在一個ActivityGroup裏的(與tabhost相似,聽說tabhost也有這個問題),致使MobileSecurePayer.java的pay方法中調用服務的兩行代碼:

?
mActivity.bindService( new  Intent(IAlixPay. class .getName()), mAlixPayConnection, Context.BIND_AUTO_CREATE);
mActivity.unbindService(mAlixPayConnection);

須要修改成:

?
1
2
mActivity.getApplicationContext().bindService( new  Intent(IAlixPay. class .getName()), mAlixPayConnection, Context.BIND_AUTO_CREATE);
mActivity.getApplicationContext().unbindService(mAlixPayConnection);

否則會報錯java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.android.server.am.ActivityRecord$Token...

8.小結
支付寶的集成比我想象的要複雜一些,比較麻煩,首先須要審覈,而後代碼須要提取,因此寫出來與你們分享。 
在作集成配置的時候,必定要仔細認真,一個地方出錯,可能要致使後面查錯查很長時間。
由於本人是先集成成功後才寫的這篇文章,不免會漏掉一些重要的細節或者步驟,若有不對,請留言指正。 

 

 

 

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

android開發之支付寶集成教程

 

 

你們好,今天這講,咱們來學習下如何在Andrdoid平臺上集成支付寶的支付接口。
如今跑步進入了移動互聯網時代,移動支付必然是一個趨勢,雖然目前還沒普及,可是,時間問題,我相信,到了年底,甚至就會愈來愈多的人用手機支付。我同窗有一個網店,我也打算用他的網店,利用淘寶無線的開源API,加上支付寶的無線支付,去開發一個小軟件,固然只在計劃中,最後會不會作成,技術不是問題,問題是由於校園招聘已經開始了,我立刻要準備找工做了,壓力比較大,作什麼都沒有激情了,定下工做的事是目前最大的事情。

好了,閒話少說,你們跟着我走,我只給你們列一個大致的框架,具體怎麼作,其實文檔說的很明白了,不過做爲新手,想要儘快集成,仍是挺麻煩的一個事。

第一步:你首先要有淘寶網和支付寶的帳號,而且在支付寶是實名認證的用戶,這個條件是必須的,爲了安全。沒完成的朋友,先去完成這步。

第二步:https://mobiless.alipay.com/index.htm
這個網址是支付寶無線平臺的官網,很差找,因此貼出來給你們。
登錄以後,在個人產品那能夠簽約,由於我已經簽約完畢,而且好像每一個帳號只能簽約一種商品,因此我無法給你們截圖,一點一點看。你們根據頁面的提示和文字,很容易就能夠明白的,我很少說。
這是我簽約後的頁面:

 2011-8-30 10:56:13 上傳
下載附件 (16.47 KB) 




簽約時,要填寫必要的信息,還有一個地方要上傳你應用的APK文件,這裏你就選一個能運行的DEMO就能夠,在審覈的時候,支付寶的人會給你打電話審覈的,問你集成支付寶幹什麼,有什麼想法等等。審覈可能要二、3天吧。你們先有個心理準備。審覈經過之後就是下面這個頁面。

 2011-8-30 10:56:15 上傳
下載附件 (49.17 KB) 




技術支持那有羣號,你們不懂的能夠去問,有人回答的,並且是官方人員,這點作的比較好。

帳戶信息那裏很是重要,在集成時會用到。爲了安全,我就把個人給塗鴉了,你們不要介意。還有一個地方,點擊密鑰管理,在這裏要生成支付寶公鑰和商戶公鑰。具體操做步驟見文檔這個地方:安全支付服務Android平臺開發指南(20110217).pdf  4.2 RSA算法簽名。都在我附件中。按照說明去生成各類密鑰,還有上傳什麼的,成功後就是下面這樣的了。

 2011-8-30 10:56:17 上傳
下載附件 (82.3 KB) 




作好了前期準備後,咱們要開始寫代碼了。
他們給了兩個例子代碼,都在我附件中。
AppDemo4_0413
SampleMsp
而後我本身寫了一個,很簡單,沒作過多的界面美化,AliTest。
你們具體看這篇文檔:支付寶安全支付簡單教程.docx,很是簡單容易。按這篇文檔去操做就一切都OK了。
你們要把示例文檔中PartnerConfig.java中的一些參數啊、密鑰啊換成本身的。爲了讓你們測試,我把個人放進去了,你們能夠直接運行程序,可是千萬別作很差的事,我還想去淘寶或者支付寶工做呢,千萬別作很差的事。測試的時候,你們在支付的時候要用本身的支付寶帳號測試,每次會支付一分錢,安全性你們能夠放心。

測試簽名框架APK算法

 

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

Android筆記30: 應用內支付寶支付集成  

2011-05-27 23:37:59|  分類: android筆記 |  標籤:android  支付寶  集成   |字號 訂閱

 

嗯,其實官方的文檔和DEMO夠用了,只是我悟性太不堪。

爲本身把過程要點給備忘一下。

 

## 準備工做

1. 要有一個支付寶帳號

2. 去http://ms.alipay.com 登陸和自助簽約 「無線部-自助簽約-手機安全支付」;

3. 完成後登陸 ms.alipay.com 在「個人產品頁」 會見到 帳戶信息像如下內容

帳戶名:abc@xxx.com

帳戶ID:208800*******993

合做商戶ID:2088*******993

4. 這個時候先無論密鑰管理,先去下載SDK包和文檔,

    下載地址 https://mobiless.alipay.com/product/product_down_load.htm?product_id=1

     解壓出如下東東備用

  • DEMO項目  //裏面有好多現成的類,好東西~
  • mobile_sp.jar //支付的類庫
  • mobile_sp.apk //支付寶安全支付控件,手機支付的前提,可捆綁在應用安裝包內支付前檢測和提示用戶安裝
  • RSA密鑰的W32生成工具 //不解釋... 交易流程sign用

5. 按文檔說明生成商傢俬鑰、公鑰對,再將私鑰轉換爲 PKCS8 格式,備用~

6. 回到 ms.alipay.com 進入帳號信息下的密鑰管理,上傳剛生成的商家公鑰,得到 AliPay的對應公鑰,備用~

(注意不要混淆 商家pub_key 和Ali_pub_key)

 

## 準備工做 part.2

呃,還得準備準備,剛纔說了DEMO裏面有不少好東西,能夠直接拿來就用,省下很多爬文檔和代碼的時間省力又省心..有用的是

  1. AlixId.java
  2. Base64.java
  3. BaseHelper.java
  4. MobileSecurePayer.java
  5. MobileSecurePayHelper.java
  6. NetworkManager.java
  7. ResultChecker.java
  8. Rsa.java

所有拿出來扔到咱們本身的項目包內,而後逐一來看看

AlixId.java ——這個不須要動,只是一些靜態的全局變量;

Base64.java ——編碼算法,不動;

Rsa.java ——同上,不動;

BaseHelper.java ——一些調用 ProgressDialog AlertDialog 還有格式轉換的現成的方法,不動;

MobileSecurePayer.java ——不用改動,裏面的 pay((String, Handler, int, Activity) ,支付用它;

MobileSecurePayHelper.java ——這裏要注意,捆綁安裝支付控件的話,要把mobile_sp.apk 放到項目 assets 路徑下,文件名能夠改別的隨便,但要注意與源碼中52行 cachePath 文件名一致,還有 retrieveApkFromAssets()中的第二個文件名參數一致。若還打算提供在線下載安裝控件的話還要更改 apkUrl ,url根據實際狀況修改。其他的不用動,是一些檢驗、安裝安全控件的方法;

NetworkManager.java ——不用動,上面若是啓用了在線下載安裝控件,就要用到這個包實現下載。

ResultChecker.java ——支付結果的解釋和校驗用,留意 Rsa.doCheck() 的第三個參數,這裏要用的是 Ali_pub_key;

 

## 開工集成

public class Pay extends Activity { 
 Spinner spPrice;   //下拉菜單,有幾個不一樣金額的支付項目選擇
 Button btAlipayl; //支付按鈕
 ProgressDialog pd; //提示Loading信息用

 
 /** Called when the activity is first created. */
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay);

        //綁定實例
        spPrice = (Spinner) findViewById(R.id.sp_pay);
        btAlipay = (Button) findViewById(R.id.bt_pay_alipay);
        pd = new ProgressDialog(this);
        pd.setCancelable(false);

        //點擊支付按鈕
        btAlipay.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub

    // check to see if the MobileSecurePay is already installed. 沒有支付安全控件的話提示安裝
    MobileSecurePayHelper mspHelper =  new MobileSecurePayHelper(Pay.this);
    boolean isMobile_spExist = mspHelper.detectMobile_sp();
    if( !isMobile_spExist )
     return;
        
    // start pay for this order.
    try
    {   
     // prepare the order info.
     String orderInfo  = getOrderInfo(spPrice.getSelectedItemPosition()); //組織要發去支付接口的數據,這裏傳遞了一個下拉菜單的選中序號,我在Array.xml仲分別定義了下拉菜單各項對應的商品名稱、詳情、價格數組
     String strsign   = Rsa.sign(orderInfo,getString(R.string.privateKey_Rsa)); //rsa算法,文檔說支持md5,我用出錯不清楚緣由,換回來了
     strsign    = URLEncoder.encode(strsign);
     String info   =  orderInfo
           + "&sign=" +  "\"" + strsign  + "\""
           + "&" + getSignType();
     
     // start the pay. 支付
     MobileSecurePayer msp = new MobileSecurePayer();
     boolean bRet = msp.pay(info, mHandler, AlixId.RQF_PAY, Pay.this);
     
     if( bRet )
     {// 嘗試收起ProgressDialog
      try
         { if( pd != null ) pd.dismiss(); }
         catch(Exception e)
         {e.printStackTrace(); }
      //而後投放支付中的提示
         pd.setMessage("正在支付");
         pd.show();         
     }
     else ;
    }
    catch (Exception ex)
    {showMsg(getString(R.string.remote_call_failed), false); }    
  } });

}

 

 //Alipay 的函數族
 // get the selected order info for pay. 組織交易數據
 String getOrderInfo(int arg2)
 {
  //如下內容在string.xml 或Array.xml中定義,參考SDK文檔
  String strOrderInfo = "partner=" + "\"" + getString(R.string.partner) + "\"";
  strOrderInfo   += "&";
  strOrderInfo   += "seller=" + "\"" + getString(R.string.seller) + "\"";
  strOrderInfo   += "&";
  strOrderInfo  += "out_trade_no=" + "\"" + getOutTradeNo() + "\"";
  strOrderInfo   += "&";
  strOrderInfo  += "subject=" + "\"" + getString(R.string.subject) + "\"";
  strOrderInfo   += "&";
  strOrderInfo  += "body=" + "\"" + getResources().getStringArray(R.array.pay_name)[arg2] + "\"";
  strOrderInfo   += "&";
  strOrderInfo  += "total_fee=" + "\"" + getResources().getStringArray(R.array.pay_ap)[arg2] + "\"";
  strOrderInfo   += "&";
  strOrderInfo  += "notify_url="  + "\"" + getString(R.string.notify_url) + "\"";

  return strOrderInfo;
 }
 
 // get the out_trade_no for an order.根據文檔生成一個不重複的商家交易號ID
 String getOutTradeNo()
 {
  SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss");
  Date date = new Date();
  String strKey = format.format(date);
  
  java.util.Random r = new java.util.Random(); 
  strKey = strKey + r.nextInt();
  strKey = strKey.substring(0, 15);
  return strKey;
 }
 
 // get the sign type we use. 定義簽名的算法,這裏用了RSA
 String getSignType()
 {
  String getSignType = "sign_type=" + "\"" + "RSA" + "\"";
  return getSignType;
 }
 
  // the handler use to receive the pay result. 接收響應支付結果的 Handler
 private Handler mHandler = new Handler()
 {
  public void handleMessage(Message msg)
  { 
   try
   {
    String strRet = (String)msg.obj;  //這個是交易結果返回的信息由幾部分組成,如: resultStatus={};memo={};result={}
    switch (msg.what)
    {
     case AlixId.RQF_PAY:
     {
      //若是支付中提示仍在,收起
      try
         {if( pd != null )  pd.dismiss();}
          catch(Exception e)
         {e.printStackTrace(); }      
      
      //把返回的結果拆包..解析成各部分信息,包括交易結果的狀態碼、錯誤信息等
      try
      {
       String memo  = "memo=";
       int imemoStart  = strRet.indexOf("memo=");
       imemoStart  +=  memo.length();
       int imemoEnd  = strRet.indexOf(";result=");
       memo = strRet.substring(imemoStart, imemoEnd);
            
       BaseHelper.showDialog(PayForm.this, "提示", memo, R.drawable.icon);
       
       // handle result
       ResultChecker resultChecker = new ResultChecker(strRet);
       boolean isPayOk = resultChecker.isPayOk(); //這種是嚴謹的驗證支付結果是否成功的方法,不嚴謹的能夠只檢測狀態碼是否9000詳情參考文檔說明
       if(isPayOk){//支付成功了,如下該幹啥幹啥...
           ... ...
           }else ;  //支付不成功的處理...
      }
      catch(Exception e)
      { e.printStackTrace();      }

     }
     break; 
    }

    super.handleMessage(msg);
   }
   catch(Exception e)
   {e.printStackTrace();}
 } }; 

}

相關文章
相關標籤/搜索