1,导入jar包
2,manifest文件中注册activity
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />
3,调起支付
联网获取符合支付宝参数规范的订单信息-->调起支付,获取同步结果-->联网通知后台同步结果
/**
* 联网获取完整的符合支付宝参数规范的订单信息,并调用支付接口
*/
private void testAlipay(String orderId, final Context context) {
RequestParams rp=new RequestParams();
rp.addBodyParameter("userid",""+((MyApplication)((Activity)context).getApplication()).getResign().getResultMap().getUserid());
rp.addBodyParameter("orderid",""+orderId);
new HttpUtils().send(HttpRequest.HttpMethod.POST, UrlUtils.getOrderPayUrl(), rp, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
PayBean pb = new Gson().fromJson(responseInfo.result, PayBean.class);
if (BuildConfig.DEBUG){
Log.e("tag", "getResultCode:" + pb.getResultCode());
}
switch (pb.getResultCode()) {
case "200":
try {
//仅需对sign 做URL编码
String sign = URLEncoder.encode(pb.getResultMap().getSign(), "UTF-8");
final String payInfo = pb.getResultMap().getSignContent() + "&sign=" + sign;
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask对象
PayTask alipay = new PayTask((Activity) context);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
break;
case "210":
Toast.makeText(context, "订单已完成", Toast.LENGTH_SHORT).show();
break;
case "211":
Toast.makeText(context,"订单已付款",Toast.LENGTH_SHORT).show();
break;
case "212":
Toast.makeText(context,"等待买家付款",Toast.LENGTH_SHORT).show();
break;
}
}
@Override
public void onFailure(HttpException e, String s) {
Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
}
});
}
/**
* 支付结果回调
* */
@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);
//同步返回的结果必须放置到服务端进行验证
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, "9000")) {
RequestParams rp=new RequestParams();
rp.addBodyParameter("memo",payResult.getMemo());
rp.addBodyParameter("result",payResult.getResult());
rp.addBodyParameter("resultStatus",payResult.getResultStatus());
new HttpUtils().send(HttpRequest.HttpMethod.POST, UrlUtils.getNotifyPayUrl(), rp, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
PayBean pb = new Gson().fromJson(responseInfo.result, PayBean.class);
switch (pb.getResultCode()) {
case "200":
Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show();
//待刷新订单状态
((HaveOrderActivity)((MyApplication)((Activity)context).getApplication()).getActivities().get(0)).refreshList();
break;
default:
Toast.makeText(context, pb.getResultCode(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(HttpException e, String s) {
Toast.makeText(context, "网络异常", Toast.LENGTH_SHORT).show();
}
});
} else {
// 判断resultStatus 为非"9000"则代表可能支付失败
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(context, "支付结果确认中", Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(context, "支付失败", Toast.LENGTH_SHORT).show();
}
}
break;
}
default:
break;
}
}
};
2,manifest文件中注册activity
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />
3,调起支付
联网获取符合支付宝参数规范的订单信息-->调起支付,获取同步结果-->联网通知后台同步结果
/**
* 联网获取完整的符合支付宝参数规范的订单信息,并调用支付接口
*/
private void testAlipay(String orderId, final Context context) {
RequestParams rp=new RequestParams();
rp.addBodyParameter("userid",""+((MyApplication)((Activity)context).getApplication()).getResign().getResultMap().getUserid());
rp.addBodyParameter("orderid",""+orderId);
new HttpUtils().send(HttpRequest.HttpMethod.POST, UrlUtils.getOrderPayUrl(), rp, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
PayBean pb = new Gson().fromJson(responseInfo.result, PayBean.class);
if (BuildConfig.DEBUG){
Log.e("tag", "getResultCode:" + pb.getResultCode());
}
switch (pb.getResultCode()) {
case "200":
try {
//仅需对sign 做URL编码
String sign = URLEncoder.encode(pb.getResultMap().getSign(), "UTF-8");
final String payInfo = pb.getResultMap().getSignContent() + "&sign=" + sign;
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask对象
PayTask alipay = new PayTask((Activity) context);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
break;
case "210":
Toast.makeText(context, "订单已完成", Toast.LENGTH_SHORT).show();
break;
case "211":
Toast.makeText(context,"订单已付款",Toast.LENGTH_SHORT).show();
break;
case "212":
Toast.makeText(context,"等待买家付款",Toast.LENGTH_SHORT).show();
break;
}
}
@Override
public void onFailure(HttpException e, String s) {
Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
}
});
}
/**
* 支付结果回调
* */
@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);
//同步返回的结果必须放置到服务端进行验证
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, "9000")) {
RequestParams rp=new RequestParams();
rp.addBodyParameter("memo",payResult.getMemo());
rp.addBodyParameter("result",payResult.getResult());
rp.addBodyParameter("resultStatus",payResult.getResultStatus());
new HttpUtils().send(HttpRequest.HttpMethod.POST, UrlUtils.getNotifyPayUrl(), rp, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
PayBean pb = new Gson().fromJson(responseInfo.result, PayBean.class);
switch (pb.getResultCode()) {
case "200":
Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show();
//待刷新订单状态
((HaveOrderActivity)((MyApplication)((Activity)context).getApplication()).getActivities().get(0)).refreshList();
break;
default:
Toast.makeText(context, pb.getResultCode(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(HttpException e, String s) {
Toast.makeText(context, "网络异常", Toast.LENGTH_SHORT).show();
}
});
} else {
// 判断resultStatus 为非"9000"则代表可能支付失败
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(context, "支付结果确认中", Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(context, "支付失败", Toast.LENGTH_SHORT).show();
}
}
break;
}
default:
break;
}
}
};