當前位置:首頁 » 安卓系統 » 支付寶androidsdk

支付寶androidsdk

發布時間: 2023-07-24 16:05:20

① android開發支付寶付款實時通知是怎麼實現的

到支付寶官網,下載支付寶集成開發包,看懂裡面的關鍵代碼

由於android設備一般用的都是無線支付,所有我們申請的就是支付寶無線快捷支付介面。


如果鏈接失效,你可以到支付寶官網商家服務模塊中找到 快捷支付(無線)這個服務。

下載集成開發包,解壓發現裡面有客戶端的demo即說明文檔,在客戶端的demo中找到Android_SDK,這個就是你要用到的支付寶介面及demo。


把demo(alipay_sdk_demo)和(alipay_lib)導入到你的eclipse裡面,然後你可以試著運行一遍demo(alipay_sdk_demo),只要把這個demo搞懂了,你就會調用這個支付寶介面了。至於到時候如何集成到你的項目裡面,文檔上說明很詳細,按著文檔上一步一步來就行了。我的建議是先把這個demo弄懂再設計你的項目,看看調用介面時需要哪些數據,這樣也有利於你一開始設計數據。

下面來簡單的介紹下介面demo裡面的結構。

你打開項目會發現裡面有5個類。

java">kagecom.alipay.android.msp.demo;

importjava.io.IOException;
........
........
importcom.alipay.android.app.sdk.AliPay;

,
OnClickListener{
publicstaticfinalStringTAG="alipay-sdk";

privatestaticfinalintRQF_PAY=1;

privatestaticfinalintRQF_LOGIN=2;

privateEditTextmUserId;
privateButtonmLogon;

@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.external_partner);

initProcts();
initListView();
}

/*
*(non-Javadoc)
*
*@seeandroid.app.Activity#onCreateOptionsMenu(android.view.Menu)
*/
@Override
(Menumenu){
menu.add(Menu.NONE,Menu.FIRST,1,"快速登錄");
returntrue;
}

/*
*(non-Javadoc)
*
*@seeandroid.app.Activity#onOptionsItemSelected(android.view.MenuItem)
*/
@Override
(MenuItemitem){
switch(item.getItemId()){
caseMenu.FIRST:
setContentView(R.layout.trustlogin);
mUserId=(EditText)findViewById(R.id.user_id);
mLogon=(Button)findViewById(R.id.get_token);
mLogon.setOnClickListener(this);
break;
}
returnfalse;
}

privatevoidinitProcts(){
if(sProcts!=null)
return;

XmlResourceParserparser=getResources().getXml(R.xml.procts);
ArrayList<Proct>procts=newArrayList<Proct>();
Proctproct=null;

try{
inteventType=parser.getEventType();

while(eventType!=XmlPullParser.END_DOCUMENT){
if(eventType==XmlPullParser.START_TAG
&&parser.getName().equalsIgnoreCase("proct")){
proct=newProct();
proct.subject=parser.getAttributeValue(0);
proct.body=parser.getAttributeValue(1);
proct.price=parser.getAttributeValue(2);
procts.add(proct);
}
eventType=parser.next();
}

sProcts=newProct[procts.size()];
procts.toArray(sProcts);

}catch(XmlPullParserExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
//listview點擊事件,裡面調用的支付寶介面
@Override
publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intposition,
longarg3){
try{
Log.i("ExternalPartner","onItemClick");
Stringinfo=getNewOrderInfo(position);//這個是訂單信息
Stringsign=Rsa.sign(info,Keys.PRIVATE);//簽名加密訂單信息什麼的
sign=URLEncoder.encode(sign);
info+="&sign=""+sign+""&"+getSignType();
Log.i("ExternalPartner","startpay");
//startthepay.
Log.i(TAG,"info="+info);

finalStringorderInfo=info;
newThread(){
publicvoidrun(){
AliPayalipay=newAliPay(ExternalPartner.this,mHandler);//這個應該就是支付寶介面了,哈哈,支付寶現在把很多功能都封裝了,所以省了很多代碼

//設置為沙箱模式,不設置默認為線上環境
//alipay.setSandBox(true);

Stringresult=alipay.pay(orderInfo);//這個是返回的結果,你到時候可以根據這個結果加以操作你想操作的,然後基本就完了,其他的你想附加的功能你看著寫吧,現在Key.java配置好就能調用快捷支付了
//後面的這些代碼可以改成你自己的,也可以在它們的基礎上改
Log.i(TAG,"result="+result);
Messagemsg=newMessage();
msg.what=RQF_PAY;
msg.obj=result;
mHandler.sendMessage(msg);
}
}.start();

}catch(Exceptionex){
ex.printStackTrace();
Toast.makeText(ExternalPartner.this,R.string.remote_call_failed,
Toast.LENGTH_SHORT).show();
}
}
//獲得訂單信息的方法
privateStringgetNewOrderInfo(intposition){
StringBuildersb=newStringBuilder();
sb.append("partner="");
sb.append(Keys.DEFAULT_PARTNER);//合作身份者id
sb.append(""&out_trade_no="");
sb.append(getOutTradeNo());//這個是訂單編號
sb.append(""&subject="");
sb.append(sProcts[position].subject);//這個應該是商品名稱
sb.append(""&body="");
sb.append(sProcts[position].body);//這個應該是商品的描述,具體你可以參考demo
sb.append(""&total_fee="");
sb.append(sProcts[position].price.replace("一口價:",""));//這個是要付款的金額,到時候你調用的時候改下就行了
sb.append(""¬ify_url="");
//網址需要做URL編碼
sb.append(URLEncoder.encode("http://notify.java.jpxx.org/index.jsp"));//伺服器非同步通知頁面,完成交易後通知商家伺服器的頁面,以post的形式將商品訂單信息發送到指定頁面,手機客戶端不需要可以先放在這不管。是不是,這個類很簡單看懂吧,就一listview。調用支付寶介面的方法就在onItemClick()方法裡面,如果你是一個按鈕的話換成按鈕點擊事件就行了,主要的細節我注釋已寫。現在你要想的是,需要哪些數據,提供給onItemClick()方法裡面的Stringinfo。demo裡面的數據是getNewOrderInfo(intposition)這個方法提供的,你可以自己提供或者在上面修改下。
現在,你已經知道代碼是如何調用支付寶介面了。接下來,是如何把這些集成到你的項目中去。

② 接入支付寶支付SDK

接入支付寶支付SDK

可以說支付寶支付接入是所有SDK最好接入的,沒有之一。

客戶端不用簽名,也不用管包名,也不用管簽名文件,就介面返回訂單,把訂單交給支付寶SDK調用就行,成功或者失敗都在當前界面返回給你。你遲罩再去通知介面。

支付流程圖

官方文檔地址

!支付寶支付官方文檔地址

按照文檔說明接入SDK和相關配置,在這就不重復了

客戶端支付關鍵代碼===》支付介面的調用(調起支付彈框)

記住支付介面的調用必須在獨立的非ui線禪悔程中執行,即需新開線程裡面調用。可以想官方demo一樣用new Thread方式。

下面我給出用Observable方式示例代碼

在PayUtils中

/**

* desc:支付寶支付

* Created by congge on 2018/8/27 17:20

* @param orderInfo 介面返回的訂單

**/

public static void aliPay(final Activity activity, final String orderInfo, final OrderListener orderListener) {

Observable.just(orderInfo)

.map(new Function () {

@Override

public String apply(String orderInfo) throws Exception {

//用戶在商戶app內部點擊付款,是否需要一個loading做為在錢包喚起之前的過渡,這個值設置為true

return new PayTask(activity).pay(orderInfo, true);

}

})

.subscribeOn(Schelers.io())

.observeOn(AndroidSchelers.mainThread())

.subscribe(new Consumer () {

@Override

public void accept(String payResult) throws Exception {

orderListener.onPayResult(payResult);

}

});

}

支付結果返回處理

返回例子:

resultStatus={9000};memo={};result={{"alipay_trade_app_pay_response":{"code":"10000","msg":"Success","app_id":"2016091300503896","auth_app_id":"2016091300503896","charset":"utf-8","timestamp":"2018-08-28 17:51:11","out_trade_no":"nVElbd74TW6WnEyxQwvX8A","total_amount":"0.01","trade_no":"2018082821001004680500208879","seller_id":"2088102175487650"},"sign":"/HIkM97PoBGAVlTmi//vYKmR0VW+2OwGhlRPPMMZtQOEqh8a9/aIijzT6ZLwy9Hl4ayG/fVKhdC1VdckF6++/+8NkoKle/QI+FA==","sign_type":"RSA2"}}

也可以自己打log看看

處碼襲鬧理示例代碼:

//支付寶支付

PayUtils.aliPay(this, result.getSignDataStr(), new PayUtils.OrderListener() {

@Override

public void onPayResult(String payResult) {

PayResult pr = new PayResult(payResult);

String rs = pr.getResultStatus();

String r = pr.getResult();

switch (rs) {

case AliPayResultStatus.PAY_SUCCESS:

ToastUtils.show(R.string.pay_success);

//通知介面支付成功

break;

case AliPayResultStatus.PAY_PROCESSING:

case AliPayResultStatus.PAY_UNKNOWN:

ToastUtils.show(R.string.pay_fail);

//支付可能成功,要介面去查詢

break;

default:

ToastUtils.show(R.string.pay_fail);

//通知介面支付失敗,取消訂單

}

}

});

上面方法中:

//通知介面支付成功 //支付可能成功,要介面去查詢 //通知介面支付失敗,取消訂單。根據你產品需求要不要通知你伺服器做的操作。正常是要的,用來改變訂單狀態

PayResult.class

public class PayResult {

private String resultStatus;

private String result;

private String memo;

public PayResult(String rawResult) {

if (TextUtils.isEmpty(rawResult))

return;

String[] resultParams = rawResult.split(";");

for (String resultParam : resultParams) {

if (resultParam.startsWith("resultStatus")) {

resultStatus = gatValue(resultParam, "resultStatus");

}

if (resultParam.startsWith("result")) {

result = gatValue(resultParam, "result");

}

if (resultParam.startsWith("memo")) {

memo = gatValue(resultParam, "memo");

}

}

}

@Override

public String toString() {

return "resultStatus={" + resultStatus + "};memo={" + memo

+ "};result={" + result + "}";

}

private String gatValue(String content, String key) {

String prefix = key + "={";

return content.substring(content.indexOf(prefix) + prefix.length(),

content.lastIndexOf("}"));

}

public String outOrder() {

String order = ""out_trade_no"";

if (result.contains(order)) {

String begin = result.substring(result.indexOf(order));

String ss = begin.split(",")[0];

String newS = ss.replace(""", "")

.replace("}", "")

.replace(":", "")

.replace("out_trade_no", "");

try {

return newS;

} catch (Exception e) {

e.printStackTrace();

}

}

return "";

}

/**

* @return the resultStatus

*/

public String getResultStatus() {

return resultStatus;

}

/**

* @return the memo

*/

public String getMemo() {

return memo;

}

/**

* @return the result

*/

public String getResult() {

return result;

}}

最後給下支付返回碼表

AliPayResultStatus.class

public class AliPayResultStatus {

/**

* 訂單支付成功,唯一肯定是支付成功的

*/

public static final String PAY_SUCCESS = "9000";

/**

* 正在處理中,支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態

*/

public static final String PAY_PROCESSING = "8000";

/**

* 訂單支付失敗

*/

public static final String PAY_FAIL = "4000";

/**

* 重復請求

*/

public static final String PAY_REPEAT = "5000";

/**

* 用戶中途取消

*/

public static final String PAY_PROCESS_CANCEL = "6001";

/**

* 網路連接出錯

*/

public static final String PAY_NET_ERROR = "6002";

/**

* 支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態

*/

public static final String PAY_UNKNOWN = "6004";}

還有一個直接棄用沙箱調試模式,否則提示支付失敗也有可能不知道錯在那,怕金額大,和介面商量,測試伺服器就用0.01測試。

③ 手機版的支付寶是用什麼語言開發的

手機版的支付寶是Java/C/C++語言開發的。

附註:

  1. Java是一種可以撰寫跨平台應用程序的面向對象的程序設計語言。Java 技術具有卓越的通用性、高效性、平台移植性和安全性,廣泛應用於PC、數據中心、游戲控制台、科學超級計算機、行動電話和互聯網,同時擁有全球最大的開發者專業社群。

  2. C語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護。C語言的表現能力和處理能力極強。它不僅具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。由於C語言實現了對硬體的編程操作,因此C語言集高級語言和低級語言的功能於一體。既可用於系統軟體的開發,也適合於應用軟體的開發。此外,C語言還具有效率高,可移植性強等特點。因此廣泛地移植到了各類各型計算機上,從而形成了多種版本的C語言。

  3. C是C++的基礎,C++語言和C語言在很多方面是兼容的。因此,掌握了C語言,再進一步學習C++就能以一種熟悉的語法來學習面向對象的語言,從而達到事半功倍的目的。

④ app中使用h5支付

因為蘋果爸爸的各種封鎖與限制,導致 app 中如果集成支付sdk上架會變得十分困難,總之是想辦法去抽成。為了應對這種流氓政策,各小 app 公司紛紛偷梁換柱,通過 h5 支付從而繞開 sdk 支付。

常規的什麼申請秘鑰,配置回調地址等操作全部忽略了,直接進入核心步驟

支付寶的 h5 支付,返回一個 http 鏈接,是可以直接在 webview 中使用的,url 會重定向最終指向到支付寶的專屬協議上。這里建議直接在 app 上直接通過 new webview 方式實現。

通過微信 h5 支付也是可以生成支付鏈接的,如果我們直接使用這個 url 的話,一定會拋一個錯誤「商家參數格式有誤,請聯系商家解決」, 微信支付的錯誤解決方案 中已經給出了原因,微信在這里校驗了 http 請求中的 referer ,我們直接打開 url 請求頭中是沒有 referer 欄位的,最容易想到的是通過 html 中的 a 標簽跳轉頁面,a 標簽會默認攜帶當前頁面的主機地址。

所以就寫了一個簡單的中轉頁面,邏輯很簡單,在中轉鏈接中添加一個 pay_url 欄位,pay_url 就是微信 h5 支付生成的鏈接,需要進行 encode 編碼一下,我們可以在 js 裡面重新解碼,設置 a 標簽的 href 熟悉,執行點擊進行跳轉。

找個伺服器或者 oss 將頁面放過去,配置一個域名,因為微信的 h5 支付是綁定了一個主域名,二級域名其實都是可以使用,假如最終配置為 pay.abc.com ,那麼我們最終的跳轉鏈接為 http://pay.abc.com?pay_url=http://wechatpay.com?xxxxxx 。

不管是微信支付還是支付寶支付,其實想從瀏覽器喚醒支付 app,都是通過特有 schema 喚醒的,支付寶的協議是 alipay://,微信的協議是 weixin://,其實和 http 協議一樣,例如: http://.com ,瀏覽器會捕獲 http 協議,支付寶和微信都會捕獲屬於自己的協議,這一點不管在 android 還是 ios 上,也正是利用了這一點,才使我們 app 中喚醒支付寶或者微信成為可能。當然後面很可能也被限制,在將來相當長的一段時間是不會的,正是這些協議使得 h5 和 app 進行交互才使得如今移動操作系統更加繁榮。

⑤ 如何開發android sdk

在APICloud上看到android sdk開發指南,它們平台上叫功能模塊,摘要一些下來看你有沒有參考價值:


1.開發環境:

PC:Windows XP/Win7/8/Mac OS;

Eclipse3.7及以上;

ADT21及以上;

Android SDK 21(5.0)及以上;

JDK1.6或者1.7。盡量不要使用1.8,存在各種潛在問題;

其中Android環境推薦使用Google整合版的Eclipse:SDK ADT Bundle;


2.開發幫助參考

Android在線API文檔:

Javascript規范及入門:

JSON數據在線Viewer:


3. 框架設計

APICloud引擎以實現對操作系統底層能力的封裝和擴展,通過系統Webkit瀏覽器引擎開放API給Javascript調用的形式,實現了HTML+CSS+Javascript開發語言和Object-C/Java/C/C++等Native開發語言之間的橋接,極大的豐富和增強了標准Javascript的能力。令前端開發者通過JS即可調用移動設備的底層功能,如:電話、簡訊、定位、多媒體、跨域http請求等,並能將如網路地圖、支付寶等第三方廠商的SDK很容易的集成至App中來。

本SDK開放橋接機制,方便具有一定Android基礎的開發者自由開發定義Native擴展模塊,豐富JS的能力,提升App的用戶體驗。APICloud引擎框架橋接層設計如圖(2):


4. 開發設計Native模塊

新建用於綁定映射至JS對象的類。在項目中新建Java類(以下以UZMoleDemo類為例,映射的JS對象為moleDemo),繼承自引擎Jar包中的APIMole或者UZMole類,並重寫相關函數。如下圖:


定義並聲明將被映射至JS類的Java函數。 若想將Java類中的某個函數映射至JS對象供JS調用,需要將該函數聲明以「jsmethod_」開頭,並且聲明該函數為public,同時接收且僅能接受一個參數:UZMoleContext。

函數聲明格式:public void jsmethod_showAlert(final UZMoleContextmoleContext){}

熱點內容
存儲光碟數據恢復 發布:2025-02-05 05:43:50 瀏覽:383
android位置信息嗎 發布:2025-02-05 05:43:45 瀏覽:439
畫師怎麼配置電腦 發布:2025-02-05 05:38:56 瀏覽:968
c語言實驗心得與小結 發布:2025-02-05 05:38:54 瀏覽:806
越南搭建伺服器 發布:2025-02-05 05:34:03 瀏覽:979
php與oracle資料庫 發布:2025-02-05 05:34:01 瀏覽:469
搶紅包Android 發布:2025-02-05 05:32:22 瀏覽:275
摩托車壓縮 發布:2025-02-05 05:23:48 瀏覽:609
access的sql語句怎麼寫 發布:2025-02-05 05:23:47 瀏覽:355
java的社區 發布:2025-02-05 05:21:36 瀏覽:70