package cn.mutils.app.pay;
import android.app.Activity;
import android.os.AsyncTask;
import com.alipay.sdk.app.PayTask;
import com.alipay.sdk.pay.demo.PayResult;
import com.alipay.sdk.pay.demo.SignUtils;
import java.net.URLEncoder;
/**
* AliPay
*/
@SuppressWarnings({"unused", "UnnecessaryUnboxing"})
public class AlipayTask extends AppPayTask {
protected String mPartner;
protected String mSeller;
protected String mRsaPrivate;
protected String mOutTradeNo;
protected String mSubject;
protected String mBody;
protected String mTotalFee;
protected String mNotifyUrl;
protected AlipayAsyncTask mTask;
protected String mTimeout;
public String getTimeout() {
return mTimeout;
}
public void setTimeout(String timeout) {
mTimeout = timeout;
}
public String getPartner() {
return mPartner;
}
public void setPartner(String partner) {
if (mStarted || mStopped) {
return;
}
mPartner = partner;
}
public String getSeller() {
return mSeller;
}
public void setSeller(String seller) {
if (mStarted || mStopped) {
return;
}
mSeller = seller;
}
public String getRsaPrivate() {
return mRsaPrivate;
}
public void setRsaPrivate(String rsaPrivate) {
if (mStarted || mStopped) {
return;
}
mRsaPrivate = rsaPrivate;
}
public String getOutTradeNo() {
return mOutTradeNo;
}
public void setOutTradeNo(String outTradeNo) {
if (mStarted || mStopped) {
return;
}
mOutTradeNo = outTradeNo;
}
public String getSubject() {
return mSubject;
}
public void setSubject(String subject) {
if (mStarted || mStopped) {
return;
}
mSubject = subject;
}
public String getBody() {
return mBody;
}
public void setBody(String body) {
if (mStarted || mStopped) {
return;
}
mBody = body;
}
public String getTotalFee() {
return mTotalFee;
}
public void setTotalFee(String totalFee) {
if (mStarted || mStopped) {
return;
}
mTotalFee = totalFee;
}
public String getNotifyUrl() {
return mNotifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
if (mStarted || mStopped) {
return;
}
mNotifyUrl = notifyUrl;
}
@Override
protected void onStart() {
this.mTask = new AlipayAsyncTask();
this.mTask.execute();
}
protected void onStop() {
if (this.mTask != null) {
this.mTask.cancel(true);
}
mTask = null;
}
/**
* create the order info. 创建订单信息
*/
protected static String getOrderInfo(String partner, String seller, String outTradeNo, String subject, String body,
String totalFee, String notifyUrl, String timeout) {
// 合作者身份ID
String orderInfo = "partner=" + "\"" + partner + "\"";
// 卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + seller + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + outTradeNo + "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + subject + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + body + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\"" + totalFee + "\"";
// 服务器异步通知页面路径
orderInfo += "¬ify_url=" + "\"" + notifyUrl + "\"";
// 接口名称, 固定值
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=\"" + (timeout != null ? timeout : "30m") + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";
// 调用银行卡支付,需配置此参数,参与签名, 固定值
// orderInfo += "&paymethod=\"expressGateway\"";
return orderInfo;
}
class AlipayAsyncTask extends AsyncTask<String, Integer, Object> {
@Override
protected Object doInBackground(String... params) {
try {
if (mContext == null) {
throw new NullPointerException();
}
if (mPartner == null) {
throw new NullPointerException();
}
if (mSeller == null) {
throw new NullPointerException();
}
if (mRsaPrivate == null) {
throw new NullPointerException();
}
if (mOutTradeNo == null) {
throw new NullPointerException();
}
if (mSubject == null) {
throw new NullPointerException();
}
if (mBody == null) {
throw new NullPointerException();
}
if (mTotalFee == null) {
throw new NullPointerException();
}
if (mNotifyUrl == null) {
throw new NullPointerException();
}
String orderInfo = getOrderInfo(mPartner, mSeller, mOutTradeNo, mSubject, mBody, mTotalFee, mNotifyUrl,
mTimeout);
String sign = SignUtils.sign(orderInfo, mRsaPrivate);
sign = URLEncoder.encode(sign, "UTF-8");
String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + "sign_type=\"RSA\"";
PayTask aliPay = new PayTask((Activity) mContext);
String result = aliPay.pay(payInfo);
PayResult payResult = new PayResult(result);
return Integer.parseInt(payResult.getResultStatus());
} catch (Exception e) {
return e;
}
}
@Override
protected void onPostExecute(Object result) {
for (AppPayListener listener : getListeners(AppPayListener.class)) {
if (result instanceof Exception) {
listener.onError(AlipayTask.this, (Exception) result);
} else {
mStatus = ((Integer) result).intValue();
if (mStatus == 9000) {
listener.onComplete(AlipayTask.this);
} else {
listener.onError(AlipayTask.this, null);
}
}
}
stop();
}
}
}