????????Android????????????????????????? ????????????demo???????????????????????????μ?????????????????????????????????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);
????// ?????????????????????????????????????????????????????????????
????String resultInfo = payResult.getResult();
????String resultStatus = payResult.getResultStatus();
????// ?ж?resultStatus ?“9000”????????????????????????????ο???????
????if (TextUtils.equals(resultStatus?? "9000")) {
????if (mListener != null) mListener.onSuccess();
????} else {
????// ?ж?resultStatus ???“9000”??????????????
????// “8000”?????????????????????????????????????????????
????// ????????????????????????С????????
????if (TextUtils.equals(resultStatus?? "8000")) {
????if (mListener != null) mListener.onWait();
????} else {
????// ??????????ж??????????????????????????????????????????
????if (mListener != null) mListener.onCancel();
????}
????}
????}
????}
????};
????/**
????* ???
????*
????* @param title   ???? ??????????“”
????* @param desc  ???? ??????????“”
????* @param price ??? ??????????“”
????* @param sn  ??????? ??????????“”
????* @param url ?????????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();
????}
????// ???????????????????淶????????
????final String payInfo = orderInfo + "&sign=/"" + sign + "/"&"
????+ getSignType();
????Runnable payRunnable = new Runnable() {
????@Override
????public void run() {
????Activity activity = mActivity.get();
????if(activity == null) return;
????// ????PayTask ????
????PayTask alipay = new PayTask(activity);
????// ????????????????????
????String result = alipay.pay(payInfo);
????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. ???????????
????*
????*/
????public String getOrderInfo(String subject?? String body?? String price??
????String sn?? String url) {
????// ???????????ID
????String orderInfo = "partner=" + "/"" + PARTNER + "/"";
????// ?????????????
????orderInfo += "&seller_id=" + "/"" + SELLER + "/"";
????// ????????????
????orderInfo += "&out_trade_no=" + "/"" + sn + "/"";
????// ???????
????orderInfo += "&subject=" + "/"" + subject + "/"";
????// ???????
????orderInfo += "&body=" + "/"" + body + "/"";
????// ??????
????orderInfo += "&total_fee=" + "/"" + price + "/"";
????// ?????????????·??
????orderInfo += "?ify_url=" + "/"" + url + "/"";
????// ??????????? ????
????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
????*   ????????????
????*/
????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;
????}
????/**
????* ?????????
????*
????* @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 groups
????if (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 spaces
????int 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 whitespace
????int 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;
????}
????}
?????????????????????????????????????????????滻ok???????????????????demo??copy??????? ????????????????????????????У?????????????
????Alipay alipay = new Alipay(OrderConfirmActivity.this);
????alipay.setListener(mAlipayListener);
????alipay.pay(desc?? mOrder.getShopName()?? String.valueOf(orderAmount)?? orderSn?? url);
????/**
????* ???????????
????*/
????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??????????????????pay????ok???? ?????????????????????????????????鷳??????????pay???????????????
????title ????????
????desc ?????????
????price ???????
????sn ????????
????url ??????????url
????????????????????????????????????????????????£?????????????????????????????????????????