一、微信支付
0.
1.在微信支付平台上的 应用签名 必须和现在的应用签名一致,应用签名是否一致的主要因素是包名和keystore文件。(微信平台上有校验签名的工具)
2.依赖:
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
3.注册APPID
IWXAPI msgApi = WXAPIFactory.createWXAPI(this, Contants.WX_Appid, false);
msgApi.registerApp(Contants.WX_Appid);(Contants.WX_Appid代表APPID)
4.
boolean isPaySupported = msgApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
if (isPaySupported) {
//data 根据服务器返回的json数据创建的实体类对象
PayReq request = new PayReq();
request.appId = data.getAppid();
request.partnerId = data.getPartnerid();
request.prepayId = data.getPrepayid();
request.packageValue = data.getPackages();
request.nonceStr = data.getNoncestr();
request.timeStamp = String.valueOf(data.getTimestamp());
request.extData = "app data"; // optional
request.sign = data.getSign();
isPay = true;
boolean b = msgApi.sendReq(request);
} else {
Toast.makeText(mContext, "当前微信版本不支持支付", Toast.LENGTH_SHORT).show();
}
5.创建一个包名为wxapi的文件夹,在包里创建一个WXPayEntryActivity类,在类里写上微信支付的回掉,
6.在WXPayEntryActivity类中实现IWXAPIEventHandler接口,在onResp方法中写上
if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
int code = baseResp.errCode;
switch (code) {
case 0:
Toast.makeText(mContext, "支付成功", Toast.LENGTH_SHORT).show();
break;
case -1:
Toast.makeText(mContext, "支付失败", Toast.LENGTH_SHORT).show();
break;
case -2:
Toast.makeText(mContext, "支付取消", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(mContext, "支付失败", Toast.LENGTH_SHORT).show();
setResult(RESULT_OK);
break;
}
}
注意:1.应用签名是否一致
2.打包之后再测试
3.不能以客户端返回结果为准,需要以服务器端的接收的支付通知或查询API返回的结果为准(就是WXPayEntryActivity类中的回调onResp方法中的代码)
4.
二、支付宝支付(有加密方式的)
1.依赖、权限、jar包就不写了,按照官网上的来就好
2.回调
//支付宝支付
private static final int SDK_PAY_FLAG = 1;
private static final int SDK_AUTH_FLAG = 2;
//支付宝合作者的账号
public static final String PARTNER = "合作者账号";
// 商户收款账号
public static final String SELLER = "收款账号";
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(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(mContext, "支付宝支付成功了", Toast.LENGTH_SHORT).show();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(mContext, "支付失败", Toast.LENGTH_SHORT).show();
}
break;
}
case SDK_AUTH_FLAG: {
@SuppressWarnings("unchecked")
AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
String resultStatus = authResult.getResultStatus();
// 判断resultStatus 为“9000”且result_code
// 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 获取alipay_open_id,调支付时作为参数extern_token 的value
// 传入,则支付账户为该授权账户
Toast.makeText(mContext,
"授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()),
Toast.LENGTH_SHORT)
.show();
} else {
// 其他状态值则为授权失败
Toast.makeText(mContext,
"授权失败" + String.format("authCode:%s", authResult.getAuthCode()),
Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
}
};
3.直接调用Alipay()方法就行
//支付宝支付
public void Alipay(RechargeBean rechargeBean) {
String body = rechargeBean.getBody();
String notify_url = rechargeBean.getNotify_url();
String out_trade_no = rechargeBean.getOut_trade_no();
String subject = rechargeBean.getSubject();
double total_fee = rechargeBean.getTotal_fee();
String price = String.valueOf(total_fee);
String orderInfo = getOrderInfo(subject, body, price, notify_url, out_trade_no);
/**
* 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
*/
String sign = sign(orderInfo);
try {
//仅需对sign 做URL编码
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(mContext);
Map<String, String> result = alipay.payV2(payInfo, true);
Log.i("msp", result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
handler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
//create the order info. 创建订单信息 支付宝订单信息拼接
private String getOrderInfo(String subject, String body, String price, String notify_url,
String out_trade_no) {
// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + PARTNER + "\"";
// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + SELLER + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + out_trade_no + "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + subject + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + body + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\"" + price + "\"";
// 服务器异步通知页面路径
orderInfo += "¬ify_url=" + "\"" + notify_url + "\"";
// 服务接口名称, 固定值
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=\"30m\"";
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&paymethod=\"expressGateway\"";
return orderInfo;
}
//get the sign type we use. 获取签名方式
private String getSignType() {
return "sign_type=\"RSA\"";
}
//sign the order info. 对订单信息进行签名,,ALIPAY_PRIVATEKEY是支付宝私钥
private String sign(String content) {
return SignUtils.sign(content, Contants.ALIPAY_PRIVATEKEY);
}
4.
5.