网上找了一个可以起吊支付宝的appdemo ,它集成了服务器端,我先将其分离为app和服务器端,保证app在接收参数后可以启调支付宝
(保证app这边是正确的 不然出错都不知道是服务器出错还是app出错),在
找网上资料修改服务器端,做好app请求接口,和支付宝的服务器回调接口
package com.zjyouths.alipaycopy;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.alipay.sdk.app.EnvUtils;
import com.alipay.sdk.app.PayTask;
import com.google.gson.Gson;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import java.util.Map;
import okhttp3.Call;
/**
* 重要说明:
*
* 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
* 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
* 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
*/
public class MainActivity extends FragmentActivity {
// /** 支付宝支付业务:入参app_id */
// public static final String APPID = "2016091300504612";/////////////////////////
//
//// /** 支付宝账户登录授权业务:入参pid值 */
//// //public static final String PID = "2088102175501574";/////////////////////////
//// /** 支付宝账户登录授权业务:入参target_id值 */
//// public static final String TARGET_ID = "";
//// //public static final String TARGET_ID = "[email protected]";
//
// /** 商户私钥,pkcs8格式 */
// /** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */
// /** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */
// /** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */
// /** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */
// /** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */
// /////////////////////////
// public static final String RSA2_PRIVATE = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCFimJbsiCByNybhEdIqpen/kQTw/+q4DVeC9xxOwW07RQ0gGNe/Dc85/cm7Dnntnui+xjAsVyWX2tqHz5tAkmqpCe6ukZvodSg4PkIk2wzRi/0zXdP4ZszQ8ei5ZeK8E7ju7K62HkD1M6TUXTuBrfMWypyy0VOhjGeQsH8mOIm2CBZt0nY5RxHTmePWR+w4x6SXYA0jL3n5JF8+KQfGE/nXsZj4uIMHN94ERQySYec/A8FVSWYvzcbIWkQ3s2hVHFPUAj1littZG83qDLnCMtWKT5XYz7gRsXDk49AsOYw7vKlkAYcBdijDAH7nm6WMrI61vmSQ5XVXy0RGNJoiVvZAgMBAAECggEBAILjNzKe7aOnpyq6xU+g/RJIcptY8T+fkE9EmuVUr2w9Lx+ic0OHO/Dzf1hkEwFc5+O/7uv3K0Or9NFIHFyl8GRTjylDKISD/q9MsmpIbLX45kowFPBztTXTClpMZHNmxDwMHctrH3m03GCiZ1Rhu0aOWJW5TI4Bk6KF1jLp+keM/bvnSXooccByBNyg3Dt6sjDj0iNei4JSC0xHmQkCnwLwLsR+0EwlwV92KPA90Fnzi1F1ek83J2+fB/nZOQr6K9Dezkaylnu3CtlfK63103qMq11FySTxh9ND10hqYptrCSdhBl+wHpAGw9SYlQZ/bEIEoYmJesh4Oefnf0gJb7ECgYEA5MqCcAi3WRkQIjqfxE9J/MhFoI0lSiodZpdCJ/JNWW/OSEbyEgkUxDAW6w9COW0YFgev5FjgV3Vps9SWnwUqujKoC+JmKDSVKwT7/VcqCdWXy3ZtrCS0tyWbYbvbXp/0WkH9nGvbnTA5Lm5SIivtL1ay7z9WNG9Y7vU+76AuekUCgYEAlWv+4zBhv3Z1gLbdY6M3ruGKA7FdY7mD86/Oo5yaiFI9njyDsKe2+nb8h8ea79zDoFYY+ZLreAE6TE0fklXEwTwO9DOW0HumbRUIj9mV36yGslJwICFuCMeBml7DYlPtsT54sDPOwEnF4OS9Q+TjM4VWW3s0DDYm8e2RRIys3oUCgYAi6s0xcAMbc/nEX5IWkctG6wHFWQVB5l+KUrdkBVTMu4WN/lXfbsdekcBNq4x92yp74jxz6ySB9IdnTKCYMF+u/yAqgCj7JdtGL4KNzYm66oA6Kx7d0NRLx0+JgPQf4uWWCNA92TAxMzTm4ythz7ZpLSAt50quwfeesIskYxv0yQKBgHm5kdpolqjQCudBkVdTJtCbwcBCZE8SWVFSvmcA887sGHBo4esupdyixBSk4i5XTTK4EP531sVbUq/IAFlI79FvaMs9n7XVlX21rdTqL7MYrF5m1BsIwMf8JzOn0UmwD6ndt5nripmRP9d24EyIESLuk6xQ0NTF5LIfk8EhTM61AoGAVAtkqBA7JEiV9gioLxXafzp4jtuFZPljqwEMtTLm0kcS914mcwm60VfMomM0l2G84UWf74seGhY8dubndJuEa9bKr9pjy1aqvo9T2oDm9ln7q1VUgwwnot23cgW6su0pHDYRi6/wPNu0zwocmTzMUu+3AlHGFEY6zIF6RjoC+XM=";
// public static final String RSA_PRIVATE = "";
private static final int SDK_PAY_FLAG = 1;
// private static final int SDK_AUTH_FLAG = 2;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_main);
}
/**
* 支付宝支付业务
*
* @param v
*/
public void payV2(View v) {
//
// /**
// * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
// * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
// * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
// *
// * orderInfo的获取必须来自服务端;
// */
// boolean rsa2 = (RSA2_PRIVATE.length() > 0);
// Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, 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;
// for(int i = 0 ; i < 100 ; i++){
// System.out.println("orderInfo "+ orderInfo);
// }
// todo orderInfo 服务器返回
String url = "http://192.168.8.110:8089/app/order/pay2.do";
String money = "0.01";
OkHttpUtils.post()
.url(url)
.addParams("money",money)
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
// todo response.getOrderString()
final String orderString ="";
System.out.println(response);
Gson gson = new Gson();
OrderInfo res = gson.fromJson(response, OrderInfo.class);
callAliPay(res.getOrderString());
}
});
// callAliPay(orderInfo);
}
private void callAliPay(final String orderInfo) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(MainActivity.this);
Map<String, String> 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();
}
}
package com.zjyouths.alipaycopy;
import android.text.TextUtils;
import java.util.Map;
public class PayResult {
private String resultStatus;
private String result;
private String memo;
public PayResult(Map<String, String> rawResult) {
if (rawResult == null) {
return;
}
for (String key : rawResult.keySet()) {
if (TextUtils.equals(key, "resultStatus")) {
resultStatus = rawResult.get(key);
} else if (TextUtils.equals(key, "result")) {
result = rawResult.get(key);
} else if (TextUtils.equals(key, "memo")) {
memo = rawResult.get(key);
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
}
package com.zjyouths.alipaycopy;
/**
* 作者:created by Administrator on 2018/8/10 19:24
* 作用:
*/
public class OrderInfo {
/**
* orderString : charset=utf-8&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%22%E9%9D%92%E5%B0%91%E5%B9%B4%E5%81%A5%E5%BA%B7%E5%B7%A5%E7%A8%8B%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22081018412319937%22%7D&method=alipay.trade.app.pay&app_id=2016091300504612&sign_type=RSA2&version=1.0×tamp=2016-07-29+16%3A55%3A53&sign=AD9o%2FoEYaymBnMA%2BTHM%2BAP2m2R1kASKbFZvFRx7MkvsV0mdUU8raZKpLGixZyq7kYQ3bT9wUU3BSosPLKGmgdYUy8ewVM8MXZ%2B%2BMugQ0EbduRYiAKmM3e1orx%2BGDZOfUFWjKvffzaB2FhUOHWahyFYeRRMlQDGuW%2FDw171bi%2BmqGTr%2FVKu7vkUvV%2FX%2FSgfODr9TzuvB2NGtm3OYrc%2BeVZEkbAVqPsPUB2%2FMSuFll2qcIee%2BfZs5tYDi4nYZ2Z5f2Tu9ANnR%2Bi7mfQWC%2Ba2kzM3OMHshUTS3mI%2BaJ6pcogGjHKVBbxkEZi32lfeDh6O5kKT412h9OxDlgfId1k3JYsg%3D%3D
*/
private String orderString;
public String getOrderString() {
return orderString;
}
public void setOrderString(String orderString) {
this.orderString = orderString;
}
}