日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android封裝支付寶支付

瀏覽:183日期:2022-06-08 09:35:07

在做Android支付的時候肯定會用到支付寶支付, 根據(jù)官方給出的demo做起來非常費勁,所以我們需要一次簡單的封裝。 封裝的代碼也很簡單,就是將官網(wǎng)給的demo提取出一個類來方便使用。

/** * 支付寶支付 * * @author lenovo */public class Alipay { // 商戶PID public static final String PARTNER = '123456789'; // 商戶收款賬號 public static final String SELLER = 'qibin0506@gmail.com'; // 商戶私鑰,pkcs8格式 public static final String RSA_PRIVATE = 'rsa_private'; // 支付寶公鑰 public static final String RSA_PUBLIC = 'rsa_public'; private static final int SDK_PAY_FLAG = 1; private WeakReference<Activity> mActivity; private OnAlipayListener mListener; public Alipay(Activity activity) {mActivity = new WeakReference<Activity>(activity); } @SuppressLint('HandlerLeak') private Handler mHandler = new Handler() {public void handleMessage(Message msg) { if (msg.what == SDK_PAY_FLAG) {PayResult payResult = new PayResult((String) msg.obj);// 支付寶返回此次支付結(jié)果及加簽,建議對支付寶簽名信息拿簽約時支付寶提供的公鑰做驗簽String resultInfo = payResult.getResult();String resultStatus = payResult.getResultStatus();// 判斷resultStatus 為“9000”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔if (TextUtils.equals(resultStatus, '9000')) { if (mListener != null) mListener.onSuccess();} else { // 判斷resultStatus 為非“9000”則代表可能支付失敗 // “8000”代表支付結(jié)果因為支付渠道原因或者系統(tǒng)原因還在等待支付結(jié)果確認, // 最終交易是否成功以服務(wù)端異步通知為準(zhǔn)(小概率狀態(tài)) if (TextUtils.equals(resultStatus, '8000')) {if (mListener != null) mListener.onWait(); } else {// 其他值就可以判斷為支付失敗,包括用戶主動取消支付,或者系統(tǒng)返回的錯誤if (mListener != null) mListener.onCancel(); }} }} }; /** * 支付 * * @param title 標(biāo)題 不能為空或者“” * @param desc 描述 不能為空或者“” * @param price 價格 不能為空或者“” * @param sn 商品唯一貨號 不能為空或者“” * @param url 服務(wù)器回調(diào)url 不能為空或者“” */ public void pay(String title, String desc, String price, String sn, String url) {// 訂單String orderInfo = getOrderInfo(title, desc, price, sn, url);// 對訂單做RSA 簽名String sign = sign(orderInfo);try { // 僅需對sign 做URL編碼 sign = URLEncoder.encode(sign, 'UTF-8');} catch (UnsupportedEncodingException e) { e.printStackTrace();}// 完整的符合支付寶參數(shù)規(guī)范的訂單信息final String payInfo = orderInfo + '&sign='' + sign + ''&'+ getSignType();Runnable payRunnable = new Runnable() { @Override public void run() {Activity activity = mActivity.get();if(activity == null) return;// 構(gòu)造PayTask 對象PayTask alipay = new PayTask(activity);// 調(diào)用支付接口,獲取支付結(jié)果String result = alipay.pay(payInfo);Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg); }};// 必須異步調(diào)用Thread payThread = new Thread(payRunnable);payThread.start(); } /** * create the order info. 創(chuàng)建訂單信息 * */ public String getOrderInfo(String subject, String body, String price, String sn, String url) {// 簽約合作者身份IDString orderInfo = 'partner=' + ''' + PARTNER + ''';// 簽約賣家支付寶賬號orderInfo += '&seller_id=' + ''' + SELLER + ''';// 商戶網(wǎng)站唯一訂單號orderInfo += '&out_trade_no=' + ''' + sn + ''';// 商品名稱orderInfo += '&subject=' + ''' + subject + ''';// 商品詳情orderInfo += '&body=' + ''' + body + ''';// 商品金額orderInfo += '&total_fee=' + ''' + price + ''';// 服務(wù)器異步通知頁面路徑orderInfo += '&notify_url=' + ''' + url + ''';// 服務(wù)接口名稱, 固定值orderInfo += '&service='mobile.securitypay.pay'';// 支付類型, 固定值orderInfo += '&payment_type='1'';// 參數(shù)編碼, 固定值orderInfo += '&_input_charset='utf-8'';// 設(shè)置未付款交易的超時時間// 默認30分鐘,一旦超時,該筆交易就會自動被關(guān)閉。// 取值范圍:1m~15d。// m-分鐘,h-小時,d-天,1c-當(dāng)天(無論交易何時創(chuàng)建,都在0點關(guān)閉)。// 該參數(shù)數(shù)值不接受小數(shù)點,如1.5h,可轉(zhuǎn)換為90m。orderInfo += '&it_b_pay='30m'';// extern_token為經(jīng)過快登授權(quán)獲取到的alipay_open_id,帶上此參數(shù)用戶將使用授權(quán)的賬戶進行支付// orderInfo += '&extern_token=' + ''' + extern_token + ''';// 支付寶處理完請求后,當(dāng)前頁面跳轉(zhuǎn)到商戶指定頁面的路徑,可空orderInfo += '&return_url='m.alipay.com'';// 調(diào)用銀行卡支付,需配置此參數(shù),參與簽名, 固定值 (需要簽約《無線銀行卡快捷支付》才能使用)// orderInfo += '&paymethod='expressGateway'';return orderInfo; } /** * sign the order info. 對訂單信息進行簽名 * * @param content * 待簽名訂單信息 */ public String sign(String content) {return SignUtils.sign(content, RSA_PRIVATE); } /** * get the sign type we use. 獲取簽名方式 * */ public String getSignType() {return 'sign_type='RSA''; } public void setListener(OnAlipayListener l) {mListener = l; } /** * 支付回調(diào)接口 * * @author lenovo * */ public static class OnAlipayListener {/** * 支付成功 */public void onSuccess() {}/** * 支付取消 */public void onCancel() {}/** * 等待確認 */public void onWait() {} }}final class Base64 { private static final int BASELENGTH = 128; private static final int LOOKUPLENGTH = 64; private static final int TWENTYFOURBITGROUP = 24; private static final int EIGHTBIT = 8; private static final int SIXTEENBIT = 16; private static final int FOURBYTE = 4; private static final int SIGN = -128; private static char PAD = ’=’; private static byte[] base64Alphabet = new byte[BASELENGTH]; private static char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; static {for (int i = 0; i < BASELENGTH; ++i) { base64Alphabet[i] = -1;}for (int i = ’Z’; i >= ’A’; i--) { base64Alphabet[i] = (byte) (i - ’A’);}for (int i = ’z’; i >= ’a’; i--) { base64Alphabet[i] = (byte) (i - ’a’ + 26);}for (int i = ’9’; i >= ’0’; i--) { base64Alphabet[i] = (byte) (i - ’0’ + 52);}base64Alphabet[’+’] = 62;base64Alphabet[’/’] = 63;for (int i = 0; i <= 25; i++) { lookUpBase64Alphabet[i] = (char) (’A’ + i);}for (int i = 26, j = 0; i <= 51; i++, j++) { lookUpBase64Alphabet[i] = (char) (’a’ + j);}for (int i = 52, j = 0; i <= 61; i++, j++) { lookUpBase64Alphabet[i] = (char) (’0’ + j);}lookUpBase64Alphabet[62] = (char) ’+’;lookUpBase64Alphabet[63] = (char) ’/’; } private static boolean isWhiteSpace(char octect) {return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); } private static boolean isPad(char octect) {return (octect == PAD); } private static boolean isData(char octect) {return (octect < BASELENGTH && base64Alphabet[octect] != -1); } /** * Encodes hex octects into Base64 * * @param binaryData * Array containing binaryData * @return Encoded Base64 array */ public static String encode(byte[] binaryData) {if (binaryData == null) { return null;}int lengthDataBits = binaryData.length * EIGHTBIT;if (lengthDataBits == 0) { return '';}int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1: numberTriplets;char encodedData[] = null;encodedData = new char[numberQuartet * 4];byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;int encodedIndex = 0;int dataIndex = 0;for (int i = 0; i < numberTriplets; i++) { b1 = binaryData[dataIndex++]; b2 = binaryData[dataIndex++]; b3 = binaryData[dataIndex++]; l = (byte) (b2 & 0x0f); k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];}// form integral number of 6-bit groupsif (fewerThan24bits == EIGHTBIT) { b1 = binaryData[dataIndex]; k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; encodedData[encodedIndex++] = PAD; encodedData[encodedIndex++] = PAD;} else if (fewerThan24bits == SIXTEENBIT) { b1 = binaryData[dataIndex]; b2 = binaryData[dataIndex + 1]; l = (byte) (b2 & 0x0f); k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; encodedData[encodedIndex++] = PAD;}return new String(encodedData); } /** * Decodes Base64 data into octects * * @param encoded * string containing Base64 data * @return Array containind decoded data. */ public static byte[] decode(String encoded) {if (encoded == null) { return null;}char[] base64Data = encoded.toCharArray();// remove white spacesint len = removeWhiteSpace(base64Data);if (len % FOURBYTE != 0) { return null;// should be divisible by four}int numberQuadruple = (len / FOURBYTE);if (numberQuadruple == 0) { return new byte[0];}byte decodedData[] = null;byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;char d1 = 0, d2 = 0, d3 = 0, d4 = 0;int i = 0;int encodedIndex = 0;int dataIndex = 0;decodedData = new byte[(numberQuadruple) * 3];for (; i < numberQuadruple - 1; i++) { if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) {return null; }// if found 'no data' just return null b1 = base64Alphabet[d1]; b2 = base64Alphabet[d2]; b3 = base64Alphabet[d3]; b4 = base64Alphabet[d4]; decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);}if (!isData((d1 = base64Data[dataIndex++]))|| !isData((d2 = base64Data[dataIndex++]))) { return null;// if found 'no data' just return null}b1 = base64Alphabet[d1];b2 = base64Alphabet[d2];d3 = base64Data[dataIndex++];d4 = base64Data[dataIndex++];if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters if (isPad(d3) && isPad(d4)) {if ((b2 & 0xf) != 0)// last 4 bits should be zero{ return null;}byte[] tmp = new byte[i * 3 + 1];System.arraycopy(decodedData, 0, tmp, 0, i * 3);tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);return tmp; } else if (!isPad(d3) && isPad(d4)) {b3 = base64Alphabet[d3];if ((b3 & 0x3) != 0)// last 2 bits should be zero{ return null;}byte[] tmp = new byte[i * 3 + 2];System.arraycopy(decodedData, 0, tmp, 0, i * 3);tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));return tmp; } else {return null; }} else { // No PAD e.g 3cQl b3 = base64Alphabet[d3]; b4 = base64Alphabet[d4]; decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);}return decodedData; } /** * remove WhiteSpace from MIME containing encoded Base64 data. * * @param data * the byte array of base64 data (with WS) * @return the new length */ private static int removeWhiteSpace(char[] data) {if (data == null) { return 0;}// count characters that’s not whitespaceint newSize = 0;int len = data.length;for (int i = 0; i < len; i++) { if (!isWhiteSpace(data[i])) {data[newSize++] = data[i]; }}return newSize; }}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('}')); } /** * @return the resultStatus */ public String getResultStatus() {return resultStatus; } /** * @return the memo */ public String getMemo() {return memo; } /** * @return the result */ public String getResult() {return result; }}class SignUtils { private static final String ALGORITHM = 'RSA'; private static final String SIGN_ALGORITHMS = 'SHA1WithRSA'; private static final String DEFAULT_CHARSET = 'UTF-8'; public static String sign(String content, String privateKey) {try { PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey)); KeyFactory keyf = KeyFactory.getInstance(ALGORITHM); PrivateKey priKey = keyf.generatePrivate(priPKCS8); java.security.Signature signature = java.security.Signature .getInstance(SIGN_ALGORITHMS); signature.initSign(priKey); signature.update(content.getBytes(DEFAULT_CHARSET)); byte[] signed = signature.sign(); return Base64.encode(signed);} catch (Exception e) { e.printStackTrace();}return null; }}

前面的幾個常量是需要去支付寶官網(wǎng)獲取的,獲取后直接替換就ok, 其他的代碼基本都是從demo中copy出來的, 現(xiàn)在我們就將支付功能封裝到了一個類中,那么如何使用呢?

Alipay alipay = new Alipay(OrderConfirmActivity.this);alipay.setListener(mAlipayListener);alipay.pay(desc, mOrder.getShopName(), String.valueOf(orderAmount), orderSn, url); /** * 支付寶支付回調(diào) */ private Alipay.OnAlipayListener mAlipayListener = new Alipay.OnAlipayListener() { @Override public void onSuccess() {onOrderSubmitSuccess(); } @Override public void onCancel() {onUserOrderCanceled(); Toast.makeText(OrderConfirmActivity.this, R.string.pay_failed, Toast.LENGTH_SHORT).show(); } @Override public void onWait() { }};

new出對象來,只需要調(diào)用pay方法就ok啦, 不過支付的回調(diào)我們還是必須的,當(dāng)然這個也不麻煩。這里說一下pay方法的幾個參數(shù),

title 支付的標(biāo)題desc 支付的描述price 支付的金額sn 商品的唯一貨號url 服務(wù)器的回調(diào)url

這幾個參數(shù)在做支付的時候服務(wù)器都會給到,但是要注意一下,這幾個參數(shù)都不能為空或者空字符串,否則會支付失敗。

標(biāo)簽: 支付寶
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产欧美日韩一区二区三区四区| 精品国产乱码久久久久久樱花| 久久中文字幕av| 欧美jjzz| 亚洲精品123区| 亚洲另类av| 国产毛片久久久| 黑森林国产精品av| 欧美另类专区| 日韩高清在线不卡| 国产成人久久精品麻豆二区| 不卡一区2区| 亚洲精品少妇| 久久伊人久久| 国产一区久久| 欧美日韩一区二区三区四区在线观看 | 国产字幕视频一区二区| 免费日韩视频| 欧美xxxx性| 亚洲精品一区二区妖精| 青草综合视频| 久久久久久久久久久妇女| 亚洲青青久久| 亚洲天堂资源| 蜜桃视频在线观看一区| 国产香蕉精品| 免费欧美一区| 欧美1区二区| 亚洲综合电影一区二区三区| 国产精久久久| 国产一区二区精品| 成人在线免费观看91| 日韩中文字幕麻豆| 国产一区2区在线观看| 免费在线观看视频一区| 国产在线观看91一区二区三区| 久久亚洲影院| 国产成人精品亚洲日本在线观看| 日韩1区2区3区| 日韩中文影院| 国产精品v日韩精品v欧美精品网站 | 亚洲精品免费观看| 在线看片国产福利你懂的| 视频精品一区二区| 色偷偷色偷偷色偷偷在线视频| 亚洲精品三级| 午夜日韩在线| 欧美13videosex性极品| 免费不卡在线视频| 欧美激情国产在线| 日韩精品视频一区二区三区| 日韩在线看片| 久久99久久久精品欧美| 丝瓜av网站精品一区二区 | 日本欧美一区二区在线观看| 成人精品中文字幕| 精品国产麻豆| 国产精品任我爽爆在线播放| 久久午夜视频| 国产韩日影视精品| 国产美女亚洲精品7777| 在线一区免费观看| 亚洲免费福利| 国产精品久久久久久久久久白浆| 中文一区一区三区免费在线观| 久久高清免费| 神马久久午夜| 久久三级毛片| 国产九一精品| 亚洲小说春色综合另类电影| 国产精品7m凸凹视频分类| 91精品xxx在线观看| 欧美aⅴ一区二区三区视频| 亚洲精品极品| 六月丁香综合| 亚洲婷婷免费| 啪啪国产精品| 日韩久久电影| 日韩国产激情| www.51av欧美视频| 福利精品一区| 韩日一区二区| 国产一区二区三区四区五区传媒| 国产免费av一区二区三区| 日韩av资源网| 91成人精品在线| 国产一卡不卡| 国产精品久久久久久久久久齐齐 | 亚洲午夜视频| 日韩欧美一区二区三区在线观看| 精品视频在线观看网站| 国产精品大片免费观看| 国产视频网站一区二区三区| 国产欧美亚洲一区| 国产视频一区二区在线播放| 国产乱码精品| 精品网站aaa| 亚洲综合电影| 激情五月色综合国产精品| 在线一区免费观看| 婷婷视频一区二区三区| 国产精品最新自拍| 国产精品成人a在线观看| 久久97视频| 日韩一区二区三区免费播放| 国产在线欧美| 欧美精品羞羞答答| 免费国产自线拍一欧美视频| 亚洲精品无播放器在线播放| 国产伦乱精品| 麻豆国产在线| 黄色成人91| 日韩激情啪啪| 国产成人1区| 视频一区中文| 综合激情婷婷| 久久麻豆视频| 久久九九精品| 久久免费国产| 伊人久久亚洲| 欧美黑人做爰爽爽爽| 日韩免费小视频| 中文无码久久精品| 久久精品国产999大香线蕉| 国产超碰精品| 中文字幕日韩高清在线| 美日韩一区二区三区| 亚洲精品一级二级| 亚洲青青久久| 日韩88av| 亚洲九九精品| 欧美日韩国产观看视频| 蜜桃视频一区二区三区| 国产欧美一区二区精品久久久| 四虎8848精品成人免费网站| 国产亚洲福利| 精品国产欧美日韩| 午夜日韩av| 国产精品美女在线观看直播| 国产综合色区在线观看| 在线观看亚洲精品福利片| 久久gogo国模啪啪裸体| 精精国产xxxx视频在线播放| 99久精品视频在线观看视频| 日韩成人午夜精品| 久久精品国内一区二区三区水蜜桃| 亚洲欧美久久精品| 成人台湾亚洲精品一区二区| 日韩三区免费| 欧美一区激情| 欧美日韩一区二区综合 | 蜜臀久久久99精品久久久久久| 国产精品.xx视频.xxtv| 成人av二区| 成人在线超碰| 日韩高清在线一区| 午夜欧美视频| 大香伊人久久精品一区二区 | 日韩影院免费视频| 一区二区精品伦理...| 美美哒免费高清在线观看视频一区二区 | 欧美www视频在线观看| 亚洲精品国产精品粉嫩| 99久久久久久中文字幕一区| 精品亚洲a∨一区二区三区18| 亚洲日韩中文字幕一区| 99久久夜色精品国产亚洲狼| 美女久久99| 91免费精品国偷自产在线在线| 女人天堂亚洲aⅴ在线观看| 91视频精品| 精品免费av| 久久国产精品免费一区二区三区| 亚洲专区欧美专区| 欧美精品一区二区久久| 国产精品高颜值在线观看| 国产探花一区在线观看| 亚洲人成亚洲精品| 亚洲一区二区三区高清| 亚洲一本视频| 国产超碰精品| 中文字幕成在线观看| 精品一区二区男人吃奶| 国产欧美日韩视频在线 | 欧美综合精品| 亚洲小说春色综合另类电影| 91精品国产91久久久久久黑人| 美女视频黄免费的久久| 国产日韩一区二区三区在线播放| 亚洲精品少妇| 免费的成人av| 日韩制服丝袜av| 亚洲美洲欧洲综合国产一区| 欧美日韩精品在线一区| 91精品啪在线观看国产18| 激情亚洲影院在线观看| 婷婷激情一区| 久久九九99| 欧美粗暴jizz性欧美20| 婷婷综合五月|