//bean类
import java.util.List; /** * Created by asus on 2017/10/22. */ public class DD { /** * msg : 请求成功 * code : 0 * data : [{"createtime":"2017-10-22T14:29:30","orderid":844,"price":99,"status":0,"uid":137},{"createtime":"2017-10-22T14:56:27","orderid":881,"price":111.99,"status":0,"uid":137}] * page : 1 */ private String msg; private String code; private String page; private Listdata; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } public List getData() { return data; } public void setData(List data) { this.data = data; } public static class DataBean { /** * createtime : 2017-10-22T14:29:30 * orderid : 844 * price : 99.0 * status : 0 * uid : 137 */ private String createtime; private int orderid; private double price; private int status; private int uid; public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public int getOrderid() { return orderid; } public void setOrderid(int orderid) { this.orderid = orderid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } } } //model包里的
import com.baway.admin.zhifubao.bean.DD; import com.baway.admin.zhifubao.utils.Api; import com.baway.admin.zhifubao.utils.Request_A; import com.google.gson.Gson; import java.io.IOException; import java.util.HashMap; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; /** * Created by asus on 2017/10/21. */ public class Model_A { private CHUANGJIAN chuangjian; private XIUGAIDINGDAN xiugaidingdan; public interface XIUGAIDINGDAN{ void XSuccess(String result); void XFail(String code, String msg); void XError(String code, String msg); } public void setXiugaidingdan(XIUGAIDINGDAN xiugaidingdan) { this.xiugaidingdan = xiugaidingdan; } public interface CHUANGJIAN{ void CSuccess(String result); void CFail(String code, String msg); void CError(String code, String msg); } public void setChuangjian(CHUANGJIAN chuangjian) { this.chuangjian = chuangjian; } public void chuangjian(String uid,String price){ Mapmap=new HashMap<>(); map.put("uid",uid); map.put("price",price); Request_A.call(Api.CHUANGJIAN, map, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); try { // Gson gson = new Gson(); // CX cx = gson.fromJson(result, CX.class); // String code = cx.getCode(); // if ("0".equals(code)) { chuangjian.CSuccess(result); // } else { // } } catch (Exception e) { e.printStackTrace(); } } }); } public void dingdan(String uid){ Map map=new HashMap<>(); map.put("uid",uid); Request_A.call(Api.DINGDAN, map, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); try { Gson gson = new Gson(); DD dd = gson.fromJson(result, DD.class); String code = dd.getCode(); if ("0".equals(code)) { chuangjian.CSuccess(result); } else { } } catch (Exception e) { e.printStackTrace(); } } }); } public void xiugaidingdan(String uid,String status,String orderId){ Map map=new HashMap<>(); map.put("uid",uid); map.put("status",status); map.put("orderId",orderId); Request_A.call(Api.XIUGAIDINGDAN, map, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); try { Gson gson = new Gson(); DD dd = gson.fromJson(result, DD.class); String code = dd.getCode(); if ("0".equals(code)) { chuangjian.CSuccess(result); } else { } } catch (Exception e) { e.printStackTrace(); } } }); } } //presenter包里的
import com.baway.admin.zhifubao.model.Model_A; import com.baway.admin.zhifubao.view.View_A; /** * Created by asus on 2017/10/21. */ public class Presenter_A implements Model_A.CHUANGJIAN, Model_A.XIUGAIDINGDAN { private Model_A model_a; private View_A view_a; public Presenter_A(View_A view_a) { this.view_a = view_a; model_a=new Model_A(); model_a.setChuangjian(this); model_a.setXiugaidingdan(this); } public void chuangjian(String uid,String price){ model_a.chuangjian(uid,price); } public void xiugaidingdan(String uid,String status,String orderId){ model_a.xiugaidingdan(uid,status,orderId); } public void dingdan(String uid){ model_a.dingdan(uid); } @Override public void CSuccess(String result) { view_a.CSuccess(result); } @Override public void CFail(String code, String msg) { } @Override public void CError(String code, String msg) { } @Override public void XSuccess(String result) { } @Override public void XFail(String code, String msg) { } @Override public void XError(String code, String msg) { } }
public class Api { public static final String LUNBO="http://120.27.23.105/ad/getAd"; public static final String SHANGPIN="http://120.27.23.105/product/getCatagory"; public static final String REGIN="http://120.27.23.105/user/reg"; public static final String LOGIN="http://www.zhaoapi.cn/user/login"; public static final String FENLEI="http://120.27.23.105/product/getCatagory"; public static final String USER="http://120.27.23.105/user/getUserInfo"; public static final String ZIFENLEI="http://120.27.23.105/product/getProductCatagory"; public static final String BITMAP="http://120.27.23.105/file/upload"; public static final String XIUGAI="http://120.27.23.105/user/updateNickName"; public static final String ZILEI="http://120.27.23.105/product/getProducts"; public static final String XIANGQING="http://120.27.23.105/product/getProductDetail"; public static final String SOUSU="http://120.27.23.105/product/searchProducts"; public static final String TIANJIA="http://120.27.23.105/product/addCart"; public static final String CHAXUN="http://120.27.23.105/product/getCarts"; public static final String GENGGAI="http://120.27.23.105/product/updateCarts"; public static final String SHANCHU="http://120.27.23.105/product/deleteCart"; public static final String CHUANGJIAN="http://120.27.23.105/product/createOrder"; public static final String DINGDAN="http://120.27.23.105/product/getOrders"; public static final String XIUGAIDINGDAN="http://120.27.23.105/product/updateOrder"; }
import android.util.Log; import java.io.IOException; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.Request; /** * Created by asus on 2017/10/22. */ public class LogInterceptor implements Interceptor { public static String TAG = "LogInterceptor"; @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); long startTime = System.currentTimeMillis(); okhttp3.Response response = chain.proceed(chain.request()); long endTime = System.currentTimeMillis(); long duration=endTime-startTime; okhttp3.MediaType mediaType = response.body().contentType(); String content = response.body().string(); Log.d(TAG,"\n"); Log.d(TAG,"----------Start----------------"); Log.d(TAG, "| "+request.toString()); String method=request.method(); if("POST".equals(method)){ StringBuilder sb = new StringBuilder(); if (request.body() instanceof FormBody) { FormBody body = (FormBody) request.body(); for (int i = 0; i < body.size(); i++) { StringBuilder append = sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ","); } sb.delete(sb.length() - 1, sb.length()); Log.d(TAG, "| RequestParams:{"+sb.toString()+"}"); } } Log.d(TAG, "| Response:" + content); Log.d(TAG,"----------End:"+duration+"毫秒----------"); return response.newBuilder() .body(okhttp3.ResponseBody.create(mediaType, content)) .build(); } }
OkHttp3Utils工具类
import android.content.Context; import java.io.IOException; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; /** * Created by asus on 2017/10/21. */ public class Request_A { private Context context; private static Request_A intsal; private Request_A(Context context){ this.context=context; } public Request_A getIntsal(Context context) { if (intsal == null) { synchronized (Request_A.class) { if (intsal == null) { intsal = new Request_A(context); } } } return intsal; } public static void call(String url, Mapparmes, final Callback callback){ OkHttpClient.Builder OB=new OkHttpClient.Builder().addInterceptor(new LogInterceptor()); OkHttpClient client=OB.build(); FormBody.Builder body=new FormBody.Builder(); for (Map.Entry stringStringEntry : parmes.entrySet()) { body.add(stringStringEntry.getKey(), stringStringEntry.getValue()); } RequestBody bb=body.build(); Request request=new Request.Builder().post(bb).url(url).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { callback.onFailure(call,e); } @Override public void onResponse(Call call, Response response) throws IOException { callback.onResponse(call,response); } }); } }
public interface View_A { void CSuccess(String result); void CFail(String code, String msg); void CError(String code, String msg); void XSuccess(String result); void XFail(String code, String msg); void XError(String code, String msg); }
public 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; } }
import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Toast; import com.alipay.sdk.app.PayTask; import com.baway.admin.zhifubao.R; import com.baway.admin.zhifubao.presenter.Presenter_A; import com.baway.admin.zhifubao.view.View_A; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Random; public class PayDemoActivity extends AppCompatActivity implements View_A { // 商户PID public static final String PARTNER = "2088901305856832"; // 商户收款账号 public static final String SELLER = "[email protected]"; // 商户私钥,pkcs8格式 private Presenter_A ppa; // private SharedPreferences sp; private SharedPreferences flag; private String uid; public static final String RSA_PRIVATE = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAM" + "/KCxg/OIj6er2GEig0DOkHqBSzEPHGigMbTXP1k2nrxEHeE59xOOuy" + "ovQH/A1LgbuVKyOac3uAN4GXIBEoozRVzDhu5dobeNm48BPcpYSAfvN3K" + "/5GLacvJeENqsiBx8KufM/9inlHaDRQV7WhX1Oe2ckat1EkdHwxxQgc" + "36NhAgMBAAECgYEAwn3sWpq6cUR65LD8h9MIjopTImTlpFjgz72bhsHD" + "ZK6A+eJDXcddrwh7DI34t/0IBqu+QEoOc/f0fIEXS9hMwTvFY59XG7M8" + "M6SdeaAbemrGmZ1IdD6YDmpbQFHn2ishaYF0YDZIkBS3WLDFrtk/efaar" + "BCpGAVXeEiVQE4LewECQQD5W1rpkq+dHDRzzdtdi1bJ479wun5CfmVDV" + "b2CJH7Iz0t8zyp/iEVV2QELnxZMphmoSzKaLXutTTj2OImpzCtRAkEA1" + "VMxG6nQq9NkU51H1+I3mlUXRZ0XeFA1GFJ7xWpNRAVhEWlDz2zy9v/g" + "X+RFpNC3f5uznycas70Xp78ew43TEQJAZFFqi9mlqTF1sLk67bFnIyX" + "rGPEOZrXvC13tNfR0xVkQZ4/46wHp0xXQo9pG4GNaoyhNnVV7EkelCPn" + "J+HPZYQJAQh6T9QgQZoGR8hyovPAf3dUL7oa/VIo/urcuJ8VIB5JHQNdI" + "rk0NjaNHj1E4iNosVgATj3vWWel9IIArb99QkQJAKvfm78lwnImtg5IM6" + "04hdn/Wu1XF8tpxsKLWcnfchMr0bM9rCmKmhAY+wdmqSyPZRiNb1QaaaD" + "TqJxLy6AnQ+Q=="; // 支付宝公钥 public static final String RSA_PUBLIC = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCd6rV3vOE578e6V" + "lGEakZpPdsX2QmGdIfi/yHe cg1CIEWzX9wn2LNFGtu1EzYQyKACG/RKeog0pUJEVGfBG30zFdNY2YocYJNdPtA" + "DqhJbS0GJm7f8 1vRiLKtOwKjdiz9oMEwxhc/5fysfMbercidRmlCDPU9BNL1UPb9bAx25JwIDAQAB"; private static final int SDK_PAY_FLAG = 1; //阿里云服务器,用真机测试 private static final String URL_JSON = "http://101.200.142.201:8080/alipayServer/AlipayDemo"; //private static final String URL_JSON = "http://192.168.190.1:8080/alipayServer/AlipayDemo"; //本机服务器,用真机访问不到,用模拟器能访问,但是支付宝不允许模拟器支付 // private static final String URL_JSON = "http://169.254.63.148:8080/alipayServer/AlipayDemo"; @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(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); Intent intent=getIntent(); int or=intent.getIntExtra("orderid",0); ppa.xiugaidingdan(uid+"",1+"",or+""); } else { // 判断resultStatus 为非"9000"则代表可能支付失败 // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态) if (TextUtils.equals(resultStatus, "8000")) { Toast.makeText(PayDemoActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show(); } else { // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误 Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show(); } } break; } default: break; } } ; }; // private IWXAPI api; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_main); ppa=new Presenter_A(this); flag =this.getSharedPreferences("flag", Context.MODE_PRIVATE); //sp= ShareUtis.getPreferences(); uid= flag.getString("uid",null); } /** * call alipay sdk pay. 调用SDK支付 */ public void pay(View v) { //客户端进行订单的签名 paySignFromClient(); } private void paySignFromClient() { //获得订单信息 String orderInfo = getOrderInfo("来自Client测试商品", "购买一部手机", "0.01"); //进行加密签名 String sign = sign(orderInfo); //通过URLEncoder进行编码 try { sign = URLEncoder.encode(sign, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } //拼装最终的支付信息 StringBuffer sb = new StringBuffer(orderInfo); sb.append("&sign=\""); sb.append(sign); sb.append("\"&"); sb.append(getSignType()); //获取必须来自服务端 final String payInfo = sb.toString();//获得最终的支付信息 Runnable payRunnable = new Runnable() { @Override public void run() { // 构造PayTask 对象 PayTask alipay = new PayTask(PayDemoActivity.this); // 调用支付接口,获取支付结果 String result = alipay.pay(payInfo, true); Log.i("TAG", "走了pay支付方法............."); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; Thread payThread = new Thread(payRunnable); payThread.start(); } /** * get the sdk version. 获取SDK版本号 */ public void getSDKVersion() { PayTask payTask = new PayTask(this); String version = payTask.getVersion(); Toast.makeText(this, version, Toast.LENGTH_SHORT).show(); } /** * 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 += "¬ify_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; } /** * 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; } /** * 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\""; } @Override public void CSuccess(String result) { } @Override public void CFail(String code, String msg) { } @Override public void CError(String code, String msg) { } @Override public void XSuccess(String result) { } @Override public void XFail(String code, String msg) { } @Override public void XError(String code, String msg) { } }//还有一个这个类
import android.text.TextUtils; 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("}")); } /** * @return the resultStatus */ public String getResultStatus() { return resultStatus; } /** * @return the memo */ public String getMemo() { return memo; } /** * @return the result */ public String getResult() { return result; } }
import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.PKCS8EncodedKeySpec; public 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; } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:id="@+id/pay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:onClick="pay" android:text="支付" tools:ignore="HardcodedText" /> LinearLayout>
<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 android:name=".zhifubao.PayDemoActivity">activity>