微信支付,支付寶支付,銀聯支付——三大支付總結

銀聯支付,支付寶支付,微信支付的三大總結,以前也有寫過兩篇。php

微信支付,支付寶支付,銀聯支付——三大支付總結:html

blog.csdn.net/androidstar…android

支付寶植入總結:git

android 支付寶的植入 《曾經踩過的坑》github

微信支付總結:web

Android 微信支付總結json

備註:出於安全考慮,驗籤咱們都是放到後臺進行驗籤的。對於咱們移動端節省了不少的勞動力。api

以前有作過支付寶支付和微信支付,因此此次作起來碰到的問題不多,key申請下來以後很快就搞定了。吼吼緩存

效果圖:安全

Markdown
Markdown

因爲用魯大師去截屏獲取gif,魯大師一針一針繪製圖片的時候應該沒作好處理,致使跳轉到相應的界面出現黑屏現象。在手機上正常跳轉,無黑屏現象。你們不用擔憂這個

準備

須要以公司名義,在支付寶,微信等平臺上開通公司帳戶而且認證,如:支付過程當中須要公司的賬號和商戶號。

支付寶支付

若是碰到一些坑的話,請參考我以前寫過的意一篇支付寶踩坑的文章:

android 支付寶的植入 《曾經踩過的坑》

    1. 首先支付寶申請並集成支付寶SDK 這裏再也不詳細介紹
參考文檔:

 https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1複製代碼
    1. 獲取訂單信息(根據本身公司的實際狀況:能夠在服務端完成,也能夠在本地完成)

      如:

      price=12.5&num=12 //價格爲12.5,數量爲12

    1. 客戶端拿這些訂單信息向服務器後臺進行請求,返回支付簽名信息signInfo
    1. app攜帶支付信息,調用支付接口請求支付寶客戶端,從而調起支付界面
/**
         * 支付寶進行請求
         *
         * @param signInfo
         */
        private void payToOrderService(final String signInfo) {
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    PayTask payTask = new PayTask(MyScannerPayActivity.this);
                    // String result = payTask.pay(signInfo, true);
                    Map<String, String> result = payTask.payV2(signInfo, true);
                    Message message = mHandler.obtainMessage();
                    message.what = SDK_PAY_FLAG;
                    message.obj = result;
                    mHandler.sendMessage(message);

                }
            }.start();
        }複製代碼
    1. 用戶操做,輸入密碼支付,支付成功;直接返回取消支付;出現錯誤,支付失敗;進入支付界面,但輸入密碼支付,支付待確認;
    1. 支付寶客戶端將支付結果告訴app客戶端,商戶服務器通知app服務器支付結果;
    1. app客戶端處理支付結果;
    1. app服務器處理支付結果。

處理結果通知:

private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case SDK_PAY_FLAG:
                    PayResult payResult = null;
                    try {
                        payResult = new PayResult((Map<String, String>) msg.obj);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    /**
                     對於支付結果,請商戶依賴服務端的異步通知結果。同步通知結果,僅做爲支付結束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回須要驗證的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判斷resultStatus 爲9000則表明支付成功
                    if (TextUtils.equals(resultStatus, PAY_OK)) {

                        ActivityUtils.showActivity(MyScannerPayActivity.this, ScannerPaySuccessActivity.class);
                        finish();
                    } else if (TextUtils.equals(resultStatus, PAY_FAILED)) {//------------------------->支付失敗
                        // 該筆訂單真實的支付結果,須要依賴服務端的異步通知。
                        Toast.makeText(MyScannerPayActivity.this, "" + payResult.getMemo(), Toast.LENGTH_LONG).show();
                    } else if (TextUtils.equals(resultStatus, PAY_CANCLE)) {//-------------------------->交易取消
                        Toast.makeText(MyScannerPayActivity.this, "" + payResult.getMemo(), Toast.LENGTH_LONG).show();
                    } else if (TextUtils.equals(resultStatus, PAY_NET_ERR)) {//------------------------->網絡出現錯誤
                        Toast.makeText(MyScannerPayActivity.this, "" + payResult.getMemo(), Toast.LENGTH_LONG).show();
                    } else if (TextUtils.equals(resultStatus, PAY_WAIT_CONFIRM)) {//--------------------->交替等待
                    }
                    break;
            }
        }
    };複製代碼

銀聯支付

先看一下官方給咱們的銀聯支付流程圖:複製代碼

Markdown
Markdown

你們不要被這張圖片搞懵逼的了,其實很簡單,這裏我將其分爲5小步。

  • 第一步:根據官方文檔選擇符合本身的sdk

    官方文檔:

    open.unionpay.com/ajweb/help/…

  • 第二步:將相對應的.so文件copy到 本身的工程裏面去。

    特別注意:

    .so文件要放在src/main 目錄下,和Java文件並行。還有就是把用到的權限複製到本身項目中)

  • 第三步: 和支付寶同樣,APP客戶端帶着這些訂單號向服務器後臺請求訂單號orderNo

  • 第四步:服務器後臺接收到購買信息以後,將信息提交給銀聯後臺,銀聯接收到後臺以後給服務器返回tn號

  • 第五步:開啓調用銀聯支付。APP客戶端帶着這個流水號,也就是第三步中服務器返回的tn號,調用銀聯SDK所提供的方法

    注意:

    這個訂單流水號爲21位純數字號

    調用方法: UPPayAssistEx.startPay(this, null, null, tn, mMode);

結果返回

處理銀聯手機支付控件返回的支付結果

調用銀聯支付後,返回app的時候用了,看返回結果傳,成功,失敗,或者是什麼返回。

如圖所示:複製代碼

Markdown
Markdown
Markdown
Markdown

最後注意在調用:

/*****************************************************************
 * mMode參數解釋: "00" - 啓動銀聯正式環境 "01" - 鏈接銀聯測試環境
 *****************************************************************/
private final String mMode = "00";複製代碼

注意:

tn值就是上面第三後臺給的tn,給到服務器那裏,
這裏我這邊是經過後臺請求下來的,關於mMode,看第一步驟,本身改一下就好了,00開發環境,01測試環境。可是要注意,這個只是個回調接口方法。

總感受銀聯支付的SDK調用起來怪怪的,貌似回到了原始深林。

微信支付:

接入流程圖:

Markdown
Markdown

  • 接入流程:

    1. 申請開發者帳號
      地址:open.weixin.qq.com/
      進入管理中心,建立移動應用
    2. 申請支付能力
    3. 代碼集成微信支付
  • 代碼集成微信支付

    • 1.客戶端代碼獲得用戶購買的商品信息,將之傳給本身公司app服務器,參數包含但不限於如下:
HashMap<String ,String> params = getHeadMap();
    params.put("appid", appID);// 微信appid,選擇性上傳,服務器寫死亦可
    params.put("money", money);// 支付金額,單位:分
    params.put("goodName", goodsName);// 商品名稱
    params.put("productNum", String.valueOf(12));// 商品的數量複製代碼
- 2.app服務器調用微信「統一下單」接口,獲得prePayId訂單號並返回prePayId給手機客戶端;

    3.手機客戶端使用prePayId及商品信息調起微信客戶端進行支付;

    3.1用戶操做:輸入密碼進行支付;返回鍵取消支付;網絡無鏈接支付失敗等;

    4.微信客戶端回調支付結果給我們的APP客戶端;

    5.微信服務器異步通知我們公司app服務器支付結果(服務器的工做,與客戶端無關)複製代碼

相關的支付調用代碼:

IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext, WX_APPID, true);
    mWxApi.registerApp(WX_APPID);
            /**
             * 請求app服務器獲得的回調結果
             */
            @Override
            public void onGet(JSONObject jsonObject) {
                if (mWxApi != null) {
                    PayReq req = new PayReq();

                    req.appId = WX_APPID;// 微信開放平臺審覈經過的應用APPID
                    try {
                        req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商戶號
                        req.prepayId = jsonObject.getString("prepayid");// 預支付訂單號,app服務器調用「統一下單」接口獲取
                        req.nonceStr = jsonObject.getString("noncestr");// 隨機字符串,不長於32位,服務器小哥會給咱生成
                        req.timeStamp = jsonObject.getString("timestamp");// 時間戳,app服務器小哥給出
                        req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,能夠直接寫死,服務器返回的也是這個固定值
                        req.sign = jsonObject.getString("sign");// 簽名,服務器小哥給出,他會根據:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指導獲得這個
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    mWxApi.sendReq(req);
                    Log.d("發起微信支付申請");
                }

            }複製代碼
注意事項:
  • 1.首先若是要使用微信支付的話

    • 必須先到微信開放平臺註冊應用,具體地址爲open.weixin.qq.com/

    • 註冊時須要填應用的包名和簽名,注意這裏的簽名是App正式版的簽名,能夠找一個已上線的包或打一個正式包,使用微信提供的工具(簽名工具下載地址爲open.weixin.qq.com/zh_CN/htmle…

    • 待審覈經過後,會獲得一個AppID和AppSecret,AppID分享和支付都要用到,AppSecret沒什麼實際用途,此時微信分享能力是直接擁有的,支付能力還要額外申請,其中涉及到財務信息等

    • 最好讓公司財務部門去申請,申請成功後會拿到一個商戶id,後面生成sign時會用到。
    • 只有全部審覈都經過後,纔可調用微信支付功能,這點是前提。
  • 2.微信分享和微信支付SDK是同一個架包,名爲libammsdk.jar。

  • 3.官方開發文檔中有一處錯誤,須要注意下,以下圖最後一行參數req應該爲request,照搬代碼的估計IDE也不會放過你,哈哈

    Markdown
    Markdown

    • 4.測試微信支付時,務必對本身的App作正式簽名,由於一開始就在微信平臺註冊過簽名信息,微信SDK會作校驗,只有這樣才能調起微信分享和微信支付,直接debug版的包則絕對調不起來,這點務必注意,不少人是跌在這裏了!當初作微信分享曾遇到過,因此會很留心,也由於如此,若是微信分享能調起來,微信支付不行,那就不要懷疑簽名問題了。
  • 5.仍是簽名,網上有人說要注意大小寫,這點實際上是沒必要的。在微信開放平臺看到審覈經過的App的簽名是大寫的,而用微信簽名獲取工具得到的則顯示小寫,這個不要緊,不要貿然改動平臺註冊信息,否則又可能致使漫長的審覈等待,上面也說了,微信分享如能夠,那就不是簽名問題。

  • 6.來講下官方demo,這東西貽害不淺啊!不少人蔘考其寫法,如生成sign放在客戶端啊,調支付的Activity添加intent-filter啊,最主要的仍是簽名問題。其實客戶端邏輯很簡單,直接上手集成便可,demo看看邏輯就行,照抄當心掉坑裏。

  • 7.網上有人說須要給調用支付的Activity配置以下intent-filter(見下圖),可能也是被demo誤導了

  • 8.對於errCode返回-1,有人說清除微信緩存或切換帳戶就行了,這種解決方案治標不治本啊,根本不能算解決方案。雖然我沒遇到能用這方法解決的問題,但目測是簽名的問題,建議還得找到真正的問題所在。

  • 9.生成sign時特別須要注意:

    • 首先將key-value鍵值對拼成字符串,注意key都要小寫,如appid,noncestr,package,partnerid,prepayid,timestamp,key,而且名字得按上述名稱
    • 咱們遇到的錯誤就是由於partnerid寫成了partnerId,prepayid寫成了PrepayId,固然咱們是在服務端寫的,若是在客戶端生成sign的話,也須要注意大小寫及名稱,詳細信息請參考官方文檔。
    • 還有這裏的key並不是AppID或AppSectet,而是在商戶平臺設置的,官方描述爲「key設置路徑:微信商戶平臺(pay.weixin.qq.com)-->帳戶設置-->API安全-->密鑰設置」。對於noncestr,申請prepayid和生成sign時兩次須要用到,因爲iOS同事看到相關文章說noncestr先後須要一致,所以這個隨機字符串咱們是設置成同樣的了,這樣作Android平臺也是OK的,不過我的感受這裏能夠不一致,因爲這個邏輯在服務器端,我並無驗證,方便的同窗能夠驗證下。
  • 10.req.packageValue=」Sign=WXPay」,通常都是這樣寫死這個參數值。也有人說寫成req.packageValue=」prepay_id=」 + prepayid,經測試Android兩種寫法都是能夠調起微信支付的,至少最新版本SDK是能夠的,之後則不清楚,官方也建議寫Sign=WXPay,聽說iOS只支持這種寫法。

Android集成微信支付的出現-1等錯誤須要注意的要點

  • 1.微信支付和支付寶支付是如今APP經常使用的支付方式,可是真正接入過兩種支付方式的猿友會很明顯的感受到微信支付真心比支付寶麻煩不少,會出現不少莫名其妙的錯誤,可是官方的文檔卻很難給出較好的解決方案.

  • 2.前幾天公司的APP須要支付功能而後也須要這個-1問題,簡直感受微信支付喪心病狂,這裏總結下本身出現的問題和一些其餘網友出現的問題作個總結

reso.errCode = -1 官方的描述: -1 錯誤 可能的緣由:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其餘異常等。

1.簽名錯誤:
  • (1).簽名的參數集合沒有按照參數名ASCII碼從小到大排序(字典序)

  • (2).簽名的是時候漏了使用key,(key的由來能夠看下面第三條的分析)

  • (3).簽名的KEY錯誤. 這裏用來簽名的key是申請支付功能之後,微信給你的一個商戶帳號裏面設置的.具體key設置路徑:微信商戶平臺(pay.weixin.qq.com)–>帳戶設置–>API安全–>密鑰設置

  • (4).簽名後的key沒有進行轉化成大寫或者其餘例如前面的簽名參數先排好序最後才加上key(key字段不參與ASCII碼的大小排序,而是直接放到最後)

  • (5),還有一些其餘的格式錯誤請參看官方文檔的詳細說明 微信官方的簽名說明,請認真對比.

  • (6),簽名問題的終極大招—–使用官方的簽名認證工具一一對比.注:最好在鏈接生成的key和最終MD5以後的結果 在log下打印出來,能夠方便查看出錯的位置 接口調試工具

2.APPID錯誤
  • (1)APPID是在open.weixin.qq.com上建立的應用,能夠經過 點擊管理中心–>應用詳情 來查看APPID

    image
    image

  • (2)建立APP時候上傳的證書與如今使用的不一致.商戶在微信開放平臺申請開發應用後,微信開放平臺會生成APP的惟一標識APPID。因爲須要保證支付安全,須要在開放平臺綁定商戶應用包名和應用簽名,設置好後才能正常發起支付。設置界面在【開放平臺】中的欄目【 管理中心 –> 修改應用 –> 修改開發信息】裏面

image
image

應用包名:是在APP項目配置文件AndroidManifest.xml中聲明的package值,例如DEMO中的package=」com.nmm.paydemo」。

應用簽名:根據項目的應用包名和編譯使用的keystore,可由簽名工具生成一個32位的md5串,在調試的手機上安裝簽名工具後,運行可生成應用簽名串,如圖8.9所示,綠色串即應用簽名。簽名工具下載地址

對比查看應用簽名是否一致,特別注意,通常上傳都是使用release版本的key因此在測試的時候就須要使用簽名版的apk,普通的debug版本key是不一致的

微信支付相關的demo地址:

github.com/androidstar…

以上是我以前作微信支付的時候的一些總結,今天再次拿出來供你們參考

以前的歷史文章:
>

支付寶植入總結:

android 支付寶的植入 《曾經踩過的坑》

微信支付總結:

Android 微信支付總結

相信本身,沒有作不到的,只有想不到的

若是你以爲此文對您有所幫助,歡迎入羣 QQ交流羣 :232203809
微信公衆號:終端研發部

Markdown
Markdown

(歡迎關注學習和交流)

相關文章
相關標籤/搜索