1、开发者平台:
https://docs.open.alipay.com/204
https://doc.open.alipay.com/doc2/alipayDocIndex.htm
支付宝支付开发者登录入口
https://openhome.alipay.com/platform/home.htm
支付结果同步返回状态码
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.um0TXa&treeId=59&articleId=103671&docType=1
异步通知说明
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.KUnD0S&treeId=59&articleId=103666&docType=1#s1
2、商户签约和密钥配置
/** 支付宝支付业务:入参app_id */
public static final String APPID = "";
/** 支付宝账户登录授权业务:入参pid值 */
public static final String PID = "";
/** 支付宝账户登录授权业务:入参target_id值 */
public static final String TARGET_ID = "";
/** 商户私钥,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 = "";
public static final String RSA_PRIVATE = "";
公钥和私钥,pkcs8的生成使用openssl工具。
3、支付集成:
集成:拷贝一个jar包;清单文件配置:权限
调用:PayTask的pay方法,传入核心参数
处理结果:handler
异步通知:支付宝服务器通知商户服务器支付结果,如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)
支付串码是自己服务器生成的,银联的是银联服务器生成。
private String url;
private AliPayBean payBean;
private String payInfo;
private MyHandler mHandler = new MyHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//服务器
url = "http://****/Pay?goodId=111&count=2&price=0.01";
}
public void alipay(View v){
//1.post信息到服务器
StringRequest request = new StringRequest(url, this, this);
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(request);
}
@Override
public void onResponse(String response) {
//2.处理返回,解析获取“支付串码”
payBean = JSON.parseObject(response, AliPayBean.class);
//支付串码
payInfo = payBean.getPayInfo();
showLog("支付串码=" + payInfo);
new Thread(new Runnable() {
@Override
public void run() {
//3.调用支付宝支付sdk支付方法,传入“支付串码”
PayTask payTask = new PayTask(MainActivity.this);
//同步返回支付结果
String payResult = payTask.pay(payInfo, true);//第一个参数是支付串码
showLog(payResult);
Message msg = mHandler.obtainMessage();
msg.obj = payResult;
mHandler.sendMessage(msg);
}
}).start();
}
@Override
public void onErrorResponse(VolleyError volleyError) {
}
private void showLog(String msg){
Log.e("result", msg+"");
}
class MyHandler extends Handler{
//4.处理支付结果
@Override
public void handleMessage(Message msg) {
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(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 判断resultStatus 为非"9000"则代表可能支付失败
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(MainActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
}
super.handleMessage(msg);
}
}