diff --git a/app/src/main/java/com/sl/house_property/order/PayActivity.java b/app/src/main/java/com/sl/house_property/order/PayActivity.java index 9057704..18b48ed 100644 --- a/app/src/main/java/com/sl/house_property/order/PayActivity.java +++ b/app/src/main/java/com/sl/house_property/order/PayActivity.java @@ -346,8 +346,13 @@ public class PayActivity extends BaseActivity { // } notifyUrl = ApiConfig.CALLBACK_PAYMENT_PAY; - tradeNo = billNumber+"|"+cart_id; + tradeNo = order_number+"|"+cart_id; + // tradeNo = cart_id; //String number = mDataBinding.number.getText().toString(); + Log.e("支付宝cart_id值==",cart_id); + Log.e("支付宝notifyUrl值==",notifyUrl); + Log.e("支付宝tradeNo值==",tradeNo); + Log.e("支付宝payment_amount值==",payment_amount); aliPayManager.startPay("", "", tradeNo, payment_amount, notifyUrl); } } diff --git a/app/src/main/java/pay/alipay/AliPayManager.java b/app/src/main/java/pay/alipay/AliPayManager.java index 711dfcb..a0a28f7 100644 --- a/app/src/main/java/pay/alipay/AliPayManager.java +++ b/app/src/main/java/pay/alipay/AliPayManager.java @@ -141,22 +141,60 @@ public class AliPayManager { }; public void startPay(String subject, String body, String tradeNo, String totalAmount, String notifyUrl) { +// if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) { +// new AlertDialog.Builder(context).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE") +// .setPositiveButton("确定", new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface dialoginterface, int i) { +// context.finish(); +// } +// }).show(); +// return; +// } +// +// /** +// * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成; +// * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成; +// * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; +// * +// * orderInfo的获取必须来自服务端; +// */ +// boolean rsa2 = (RSA2_PRIVATE.length() > 0); +// Map params = OrderInfoUtil2_0.buildOrderParamMap(APPID, subject, body, tradeNo, totalAmount, notifyUrl, rsa2); +// String orderParam = OrderInfoUtil2_0.buildOrderParam(params); +// +// String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE; +// String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2); +// final String orderInfo = orderParam + "&" + sign; +// +// Runnable payRunnable = new Runnable() { +// @Override +// public void run() { +// PayTask alipay = new PayTask(context); +// Map result = alipay.payV2(orderInfo, true); +// Log.i("msp", result.toString()); +// +// Message msg = new Message(); +// msg.what = SDK_PAY_FLAG; +// msg.obj = result; +// mHandler.sendMessage(msg); +// } +// }; +// +// Thread payThread = new Thread(payRunnable); +// payThread.start(); + + if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) { - new AlertDialog.Builder(context).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE") - .setPositiveButton("确定", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialoginterface, int i) { - context.finish(); - } - }).show(); + // showAlert(this, getString(R.string.error_missing_appid_rsa_private)); return; } - /** + /* * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成; * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成; * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; * - * orderInfo的获取必须来自服务端; + * orderInfo 的获取必须来自服务端; */ boolean rsa2 = (RSA2_PRIVATE.length() > 0); Map params = OrderInfoUtil2_0.buildOrderParamMap(APPID, subject, body, tradeNo, totalAmount, notifyUrl, rsa2); @@ -166,7 +204,8 @@ public class AliPayManager { String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2); final String orderInfo = orderParam + "&" + sign; - Runnable payRunnable = new Runnable() { + final Runnable payRunnable = new Runnable() { + @Override public void run() { PayTask alipay = new PayTask(context); @@ -180,6 +219,7 @@ public class AliPayManager { } }; + // 必须异步调用 Thread payThread = new Thread(payRunnable); payThread.start(); } diff --git a/app/src/main/java/pay/alipay/OrderInfoUtil2_0.java b/app/src/main/java/pay/alipay/OrderInfoUtil2_0.java index 9dd6626..1b92718 100644 --- a/app/src/main/java/pay/alipay/OrderInfoUtil2_0.java +++ b/app/src/main/java/pay/alipay/OrderInfoUtil2_0.java @@ -23,21 +23,31 @@ public class OrderInfoUtil2_0 { Map keyValues = new HashMap(); keyValues.put("app_id", app_id); - - keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"" + totalAmount + "\",\"subject\":\"" + subject + "\",\"body\":\"" + body + "\",\"out_trade_no\":\"" + tradeNo + "\"}"); - + keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"" + totalAmount + "\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + tradeNo + "\"}"); + // keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"0.01\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + getOutTradeNo() + "\"}"); keyValues.put("charset", "utf-8"); - keyValues.put("method", "alipay.trade.app.pay"); - keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA"); - keyValues.put("timestamp", getCurFormatTime()); - keyValues.put("notify_url", notifyurl); - keyValues.put("version", "1.0"); + //+++++++++++++++++++++ + +// keyValues.put("app_id", app_id); +// +// keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"0.01\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + getOutTradeNo() + "\"}"); +// +// keyValues.put("charset", "utf-8"); +// +// keyValues.put("method", "alipay.trade.app.pay"); +// +// keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA"); +// +// keyValues.put("timestamp", getCurFormatTime()); +// +// keyValues.put("version", "1.0"); + return keyValues; } @@ -64,7 +74,20 @@ public class OrderInfoUtil2_0 { return sb.toString(); } + /** + * 要求外部订单号必须唯一。 + * @return + */ + private static 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; + } /** * 拼接键值对 * diff --git a/app/src/main/java/pay/alipay/SignUtils.java b/app/src/main/java/pay/alipay/SignUtils.java index 9b2d0dd..08068b5 100644 --- a/app/src/main/java/pay/alipay/SignUtils.java +++ b/app/src/main/java/pay/alipay/SignUtils.java @@ -6,6 +6,42 @@ 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 SIGN_SHA256RSA_ALGORITHMS = "SHA256WithRSA"; +// +// private static final String DEFAULT_CHARSET = "UTF-8"; +// +// private static String getAlgorithms(boolean rsa2) { +// return rsa2 ? SIGN_SHA256RSA_ALGORITHMS : SIGN_ALGORITHMS; +// } +// +// public static String sign(String content, String privateKey, boolean rsa2) { +// try { +// PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( +// Base64.decode(privateKey)); +// KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM, "BC"); +// PrivateKey priKey = keyFactory.generatePrivate(priPKCS8); +// +// java.security.Signature signature = java.security.Signature +// .getInstance(getAlgorithms(rsa2)); +// +// signature.initSign(priKey); +// signature.update(content.getBytes(DEFAULT_CHARSET)); +// +// byte[] signed = signature.sign(); +// +// return Base64.encode(signed); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// +// return null; +// } + + private static final String ALGORITHM = "RSA"; private static final String SIGN_ALGORITHMS = "SHA1WithRSA"; @@ -17,13 +53,13 @@ public class SignUtils { private static String getAlgorithms(boolean rsa2) { return rsa2 ? SIGN_SHA256RSA_ALGORITHMS : SIGN_ALGORITHMS; } - + public static String sign(String content, String privateKey, boolean rsa2) { try { PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey)); - KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM, "BC"); - PrivateKey priKey = keyFactory.generatePrivate(priPKCS8); + KeyFactory keyf = KeyFactory.getInstance(ALGORITHM); + PrivateKey priKey = keyf.generatePrivate(priPKCS8); java.security.Signature signature = java.security.Signature .getInstance(getAlgorithms(rsa2)); diff --git a/开发文档 b/开发文档 index 8e1f94c..77f59af 100644 --- a/开发文档 +++ b/开发文档 @@ -1,2 +1,4 @@ 1.支付宝支付 - MyPayActivity \ No newline at end of file + MyPayActivity + 下载官方demo,传入appid 和RSA2_PRIVATE两个参数即可实现支付,demo下载地址:https://opendocs.alipay.com/open/54/104509 + alipay_demo保存在 \ No newline at end of file