1. 程式人生 > >超詳細Android接入支付寶支付實現,有圖有真相

超詳細Android接入支付寶支付實現,有圖有真相

接上篇android接入微信支付文章,這篇我們帶你來接入支付寶支付服務

簡介

首先要說明的是個人感覺接入支付寶比微信簡單多了,很輕鬆的,所以同學們不要緊張~

當然還是老規矩啦,上來肯定的貼上官網地址,因為我這些服務天天在更新,而我的文章是教大家方法,而讓你不是照葫蘆畫瓢


進入app支付文件有兩種方式,一種是直接在下面的開放業務裡


還有一種是通過上面的導航欄文件中心,然後滾動到業務接入那一欄,可以看到移動支付


當然也可以直接開啟這個地址,文件還是挺多,可以關注我勾選的這幾項


首先這裡我也要說明的是個人是不能申請的,只能是企業,所以我demo裡面的用的一些資料也是demo裡面的

這裡是互動流程的

官方文件,需要詳細的可以點進去看看

執行Demo


可以看到有兩個,選擇你需要的就行了,下載解壓完直接匯入eclipse並配置一些引數執行就可以檢視效果了

匯入jar

將demo裡面的alipaySdk-20160223.jar拷貝到我們工程的libs下,並新增到依賴中

配置

許可權

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

activity

<activity
    android:name="com.alipay.sdk.app.H5PayActivity"
    android:configChanges
="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind">
</activity> <activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"> </activity>

訂單資料生成

這一步,可以在服務端完成,也可以在本地完成

String orderInfo = getOrderInfo("測試的商品", "該測試商品的詳細描述", "0.01");

/**
 * 特別注意,這裡的簽名邏輯需要放在服務端,切勿將私鑰洩露在程式碼中!
 */
String sign = sign(orderInfo);
try {
    /**
     * 僅需對sign 做URL編碼
     */
    sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

/**
 * 完整的符合支付寶引數規範的訂單資訊
 */
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

Runnable payRunnable = new Runnable() {

    @Override
    public void run() {
        // 構造PayTask 物件
        PayTask alipay = new PayTask(MainActivity.this);
        // 呼叫支付介面,獲取支付結果
        String result = alipay.pay(payInfo, true);

        Message msg = new Message();
        msg.what = SDK_PAY_FLAG;
        msg.obj = result;
        mHandler.sendMessage(msg);
    }
};

// 必須非同步呼叫
Thread payThread = new Thread(payRunnable);
payThread.start();

處理支付結果

@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
    @SuppressWarnings("unused")
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case SDK_PAY_FLAG: {
                PayResult payResult = new PayResult((String) msg.obj);
                /**
                 * 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/
                 * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                 * docType=1) 建議商戶依賴非同步通知
                 */
                String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊

                String resultStatus = payResult.getResultStatus();
                // 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考介面文件
                if (TextUtils.equals(resultStatus, "9000")) {
                    Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                } else {
                    // 判斷resultStatus 為非"9000"則代表可能支付失敗
                    // "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端非同步通知為準(小概率狀態)
                    if (TextUtils.equals(resultStatus, "8000")) {
                        Toast.makeText(MainActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();

                    } else {
                        // 其他值就可以判斷為支付失敗,包括使用者主動取消支付,或者系統返回的錯誤
                        Toast.makeText(MainActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();

                    }
                }
                break;
            }
            default:
                break;
        }
    }

};

這裡支付成功了,只是提示使用者,還得從伺服器確認是否正在支付了,我這裡只寫了本地,其他如果在服務端實現是一樣的,你把這程式碼直接發給後端就行了(如果後端是Java開發),可以看到我們已經成功調起支付寶服務了


完整程式碼:

package cn.woblog.testalipay;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;

import cn.woblog.testalipay.domain.PayResult;
import cn.woblog.testalipay.util.SignUtils;

public class MainActivity extends AppCompatActivity {
    public static final String PARTNER = "";

    // 商戶收款賬號
    public static final String SELLER = "";

    // 商戶私鑰,pkcs8格式
    public static final String RSA_PRIVATE = "";

    private static final int SDK_PAY_FLAG = 1;

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    PayResult payResult = new PayResult((String) msg.obj);
                    /**
                     * 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/
                     * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                     * docType=1) 建議商戶依賴非同步通知
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊

                    String resultStatus = payResult.getResultStatus();
                    // 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考介面文件
                    if (TextUtils.equals(resultStatus, "9000")) {
                        Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 判斷resultStatus 為非"9000"則代表可能支付失敗
                        // "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端非同步通知為準(小概率狀態)
                        if (TextUtils.equals(resultStatus, "8000")) {
                            Toast.makeText(MainActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();

                        } else {
                            // 其他值就可以判斷為支付失敗,包括使用者主動取消支付,或者系統返回的錯誤
                            Toast.makeText(MainActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();

                        }
                    }
                    break;
                }
                default:
                    break;
            }
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void testAlipay(View view) {
        if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {
            new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")
                    .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialoginterface, int i) {
                            //
                            finish();
                        }
                    }).show();
            return;
        }

        String orderInfo = getOrderInfo("測試的商品", "該測試商品的詳細描述", "0.01");

/**
 * 特別注意,這裡的簽名邏輯需要放在服務端,切勿將私鑰洩露在程式碼中!
 */
        String sign = sign(orderInfo);
        try {
            /**
             * 僅需對sign 做URL編碼
             */
            sign = URLEncoder.encode(sign, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

/**
 * 完整的符合支付寶引數規範的訂單資訊
 */
        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 構造PayTask 物件
                PayTask alipay = new PayTask(MainActivity.this);
                // 呼叫支付介面,獲取支付結果
                String result = alipay.pay(payInfo, true);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

// 必須非同步呼叫
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }


    /**
     * create the order info. 建立訂單資訊
     */
    private String getOrderInfo(String subject, String body, String price) {

        // 簽約合作者身份ID
        String orderInfo = "partner=" + "\"" + PARTNER + "\"";

        // 簽約賣家支付寶賬號
        orderInfo += "&seller_id=" + "\"" + SELLER + "\"";

        // 商戶網站唯一訂單號
        orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";

        // 商品名稱
        orderInfo += "&subject=" + "\"" + subject + "\"";

        // 商品詳情
        orderInfo += "&body=" + "\"" + body + "\"";

        // 商品金額
        orderInfo += "&total_fee=" + "\"" + price + "\"";

        // 伺服器非同步通知頁面路徑
        orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\"";

        // 服務介面名稱, 固定值
        orderInfo += "&service=\"mobile.securitypay.pay\"";

        // 支付型別, 固定值
        orderInfo += "&payment_type=\"1\"";

        // 引數編碼, 固定值
        orderInfo += "&_input_charset=\"utf-8\"";

        // 設定未付款交易的超時時間
        // 預設30分鐘,一旦超時,該筆交易就會自動被關閉。
        // 取值範圍:1m~15d。
        // m-分鐘,h-小時,d-天,1c-當天(無論交易何時建立,都在0點關閉)。
        // 該引數數值不接受小數點,如1.5h,可轉換為90m。
        orderInfo += "&it_b_pay=\"30m\"";

        // extern_token為經過快登授權獲取到的alipay_open_id,帶上此引數使用者將使用授權的賬戶進行支付
        // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

        // 支付寶處理完請求後,當前頁面跳轉到商戶指定頁面的路徑,可空
        orderInfo += "&return_url=\"m.alipay.com\"";

        // 呼叫銀行卡支付,需配置此引數,參與簽名, 固定值 (需要簽約《無線銀行卡快捷支付》才能使用)
        // orderInfo += "&paymethod=\"expressGateway\"";

        return orderInfo;
    }

    /**
     * sign the order info. 對訂單資訊進行簽名
     *
     * @param content 待簽名訂單資訊
     */
    private String sign(String content) {
        return SignUtils.sign(content, RSA_PRIVATE);
    }

    /**
     * get the sign type we use. 獲取簽名方式
     */
    private String getSignType() {
        return "sign_type=\"RSA\"";
    }

    /**
     * get the out_trade_no for an order. 生成商戶訂單號,該值在商戶端應保持唯一(可自定義格式規範)
     */
    private String getOutTradeNo() {
        SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
        Date date = new Date();
        String key = format.format(date);

        Random r = new Random();
        key = key + r.nextInt();
        key = key.substring(0, 15);
        return key;
    }

}

如果要測試demo,請替換

MainActivity中PARTNER,SELLER,RSA_PRIVATE為你申請到的值

相關推薦

詳細Android接入支付支付實現真相

接上篇android接入微信支付文章,這篇我們帶你來接入支付寶支付服務 簡介 首先要說明的是個人感覺接入支付寶比微信簡單多了,很輕鬆的,所以同學們不要緊張~ 當然還是老規矩啦,上來肯定的貼上官網地址,因為我這些服務天天在更新,而我的文章是教大家方法,而讓你不是照葫蘆畫瓢 進入app支付文件有兩種方式,一

Android接入支付支付實現

price show inf mms subject 商品詳情 轉換 || In 接上篇android接入微信支付文章,這篇我們帶你來接入支付寶支付服務 簡介 首先要說明的是個人感覺接入支付寶比微信簡單多了,很輕松的,所以同學們不要緊張~ 當然還是老規矩啦,上來肯定的

android-實現支付支付從底部彈窗效果

前言 我們再用支付寶支付的時候,會從底部彈上來一個對話方塊,讓我們選擇支付方式等等,今天我們就來慢慢實現這個功能 效果圖 實現 主介面很簡單,就是一個按鈕,點選後跳到支付詳情的Fragment中 package com.example.hfs.alipayuidemo; impor

APP接入支付支付之服務端實現

最近公司接了一個外包專案,開發過程中用到了呼叫微信和支付寶的第三方支付介面,因為之前沒用整合過,所以這次用到了之後就想總結一下分享給大家,這裡只介紹支付寶的APP支付和提現介面的服務端接入實現。  首先,要接入第三方的介面,最重要的還是先看官方文件,因為不管你從哪裡搜尋

Android移動支付支付支付2017最新接入詳解)

接入流程 一:公司開通支付寶商戶號  二:註冊登入螞蟻金服開放平臺建立應用  三:專案整合支付寶SDK 一:公司開通支付寶商戶號 1 註冊商戶號:https://mobiless.alipay.com/ 可以把連結發給人事,讓她弄一下,需要提交的

Android 整合支付SDK實現快捷支付--填坑

    剛給app集成了支付寶的android客戶端快捷支付SDK,整合很簡單,但是由於是涉及錢的問題,大家都會持謹慎態度,所以有很多小坑,粗心的話整合之路會很坎坷,對於整合步驟,我不想寫了,沒有必要,就看官方的SDK整合文件就好,內容也不多,對於整合步驟這個不推薦看部落格

一步一步帶你完成支付支付功能的整合(詳細

首先說說筆者的整合經歷,一開始整合時,像往常一樣百度了一下整合的方法,然後出來一大堆結果,以為應該會很簡單,然而事實卻並非如此。網上的整合方法很多都是舊版本的整合,現在支付寶已經對sdk以及demo進行了更新,雖說和舊版差別不是很大,不過對於不瞭解整個流程的開發

Android 微信 支付支付2行程式碼實現支付

作者簡介 微信公眾號(高質量文章推送):走向全棧工程師 作者:陳博易 宣告:本文是個人原創,未經允許請勿轉載 商業合作請在微信公眾號回覆:聯絡方式 前言 現在的多數App都離不開整合阿里支付寶支付和微信支付

Android 微信支付支付支付 快速接入

先放上接入兩個支付平臺的官方文件地址 一、支付寶支付 匯入開發資源 在商戶應用工程的AndroidManifest.xml檔案裡面新增宣告: <activity android:name="com.ali

淺談android接入銀聯,支付支付平臺的方式

// 建立支付寶訂單資訊private String getNewOrderInfo(Pay pay) {StringBuilder sb = new StringBuilder();sb.append("partner=\"");sb.append(Keys.DEFAULT_PARTNER);sb.app

Android實現支付支付總結

1.支付寶官網中登入企業支付寶證號,建立應用獲取APPID 2.下載生成公私鑰工具生成應用公鑰和應用私鑰 3.上傳應用公鑰,獲取支付寶公鑰 4.把APPID   支付寶公鑰 發給服務端 5.獲取簽名後的 6.整合,下載官方demo後,將alipaySdk-20170

Android實現支付支付遇到的問題記錄--主要是和伺服器的合作上

一、已解決 1、客戶端需要處理的很簡單:跟伺服器介面要帶有簽名的商品資訊(即支付寶api需要的入參) 2、伺服器的聯合排查工作(由於伺服器工作較忙,需要聯合定位,且自己對php不瞭解,過程比較頭疼和耗時),主要出現兩個問題: 1)ALI64      解決:伺服器返回的字串

支付支付接入(Android/IOS(swift)/Java後臺)

本文章僅作為個人筆記 IOS端(swift): //從伺服器獲取支付簽名字串,這裡在後面伺服器程式碼裡會說明,交給伺服器處理即可 var signStr = getAliPayPaySignStrFromService() //調起支付寶

Android移動支付支付支付2016最新接入詳解)

接入流程 一:公司開通支付寶商戶號 二:註冊登入螞蟻金服開放平臺建立應用 三:專案整合支付寶SDK 一:公司開通支付寶商戶號 二:註冊登入螞蟻金服開放平臺建立應用 1 建立應用 2 應用環境設定 應用公鑰配置 點選支付寶

Android中的微信、支付支付功能的簡單實現

眾所周知如果想使用像支付寶的支付功能或者微信的支付功能,前提是必須得先去各自的開發者平臺上建立賬戶獲得appkey,但是在申請的時候需要提交各自材料,如下圖所示: 可以看到申請時需要的材料非常多,不管是企業支付還是個體都需要一系列的材料,但是像我們這樣的個

Android微信支付支付支付快速接入

一、支付寶接入1、建立應用並獲取APPID開發者中心中建立您的應用,會為您生成應用唯一標識(APPID),並且可以申請開通開放產品使用許可權,通過APPID您的應用才能呼叫開放產品的介面能力。在“我的應用”中按下圖方式檢視APPID。2、新增支付功能3、簽約(涉及到收費)4、

個人網站如何使用支付收款實現

php 支付寶想給個人網站增加一個支付,找到https://neue.v2ex.com/t/350564,按照裏面大家討論的,還真的可以了。1.開通功能https://neue.v2ex.com/t/326701 有個商家二維碼圖中二維碼是服務商的員工碼,作為推廣的服務商肯定是會有返利但是不通員工碼,個人是

ThinkPHP5 支付支付擴展庫(簡單好用~)

thinkphp5 支付寶支付 alipay 支付寶擴展我的想法是,只需要調用一個靜態方法就可以完成所需要的所有工作,再也不必重復造輪子!ThinkPHP5 支付寶支付擴展庫, 包括手機網站支付、電腦網站支付、支付查詢、退款、退款查詢、對賬單等隨著支付寶官方不斷更新(目前是2017年7月21日),大家可以在G

微信和支付支付模式詳解及實現

配置 其余 logs https 朋友 一個 target 多租戶 對比   繼上篇《微信和支付寶支付模式詳解及實現》到現在已經有半年時間了,這期間不少朋友在公號留言支付相關的問題,最近正好也在處理公司支付相關的對接,打算寫這篇來做一個更進一步的介紹,同時根據主要的幾個支付

接入支付支付接口(一):發起支付請求

支付寶一、前言在接入支付寶接口之前,需要在支付寶官網進行應用註冊和實名認證,地址不再貼出。在此,貼出支付寶開放平臺文檔地址:https://docs.open.alipay.com/58/103585/在這個地址中,詳細介紹了如何接入支付寶接口二、發起請求支付寶的簽名方式等不做詳細介紹,在開發文檔中有詳細說明