项目2.0版本集成了支付宝支付和微信支付,集成的过程中遇到了一些坑,在此总结一下。
支付宝支付和微信相比较,支付宝支付的集成相对比较的麻烦。
支付宝支付
第一步:导入支付宝SDK
第二步:用公司账号注册一个支付宝,然后签约并开通移动支付功能
第三步:按照开发文档生成自己公司的公钥和私钥,然后进入管理者账号里面,把公司公钥上传到支付宝
第四步:考虑到安全问题,OrderbillInfo建议后台生成,不必要在代码中生成,特别注意,后台生成的格式一定要和开发文档的形式一模一样
//支付宝支付
public static void payZhifuBao(final Activity activity,final String stringSign, final Handler mHandler) {
// 必须异步调用
Thread payThread = new Thread(new MyRunnable(stringSign,activity,mHandler));
payThread.start();
}
private static class MyRunnable implements Runnable{
private String sign;
private Activity mActivity;
private Handler mHandler;
public MyRunnable(String sign, Activity activity, Handler handler) {
this.sign = sign;
mActivity = activity;
mHandler = handler;
}
public MyRunnable(String sign, Activity activity) {
this.sign = sign;
mActivity = activity;
}
public MyRunnable(String sign) {
this.sign = sign;
}
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(mActivity);
// 调用支付接口,获取支付结果
sign = sign.replace("=", "=\"").replace("&", "\"&");
StringBuffer stringBuffer = new StringBuffer(sign);
stringBuffer.append("\"");
String result = alipay.pay(stringBuffer.toString(), true);
Message msg = new Message();
msg.what = Constant.GET_PAY_SIGN_SUCCESS_RESULTE;
msg.obj = result;
mHandler.sendMessage(msg);
}
}
支付宝回调
case Constant.GET_PAY_SIGN_SUCCESS_RESULTE: {
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(BuyAdvancePayActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
mCustomLoading.showBar();
CommentUtil.changeBuyBillState(node, 5, 2, mHandler);
} else {
// 判断resultStatus 为非"9000"则代表可能支付失败
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(BuyAdvancePayActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(BuyAdvancePayActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
}
break;
微信支付
第一步:注册微信支付
第二步:导入SDK
第三步:在项目建立一个与注册支付包名相同文件夹,文件名为wxapi,然后在该文件夹下创建如下文件,该类主要处理微信支付的回调:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, Constant.WX_APP_ID, false);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
Intent intent = new Intent("com.taolv365.android.info.pay");
switch (resp.errCode) {
case 0:
Toast.makeText(WXPayEntryActivity.this, "支付完成", Toast.LENGTH_SHORT).show();
intent.putExtra("WXResulte",0);
break;
case -1:
Toast.makeText(WXPayEntryActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
intent.putExtra("WXResulte", -1);
break;
case -2:
Toast.makeText(WXPayEntryActivity.this, "支付取消", Toast.LENGTH_SHORT).show();
intent.putExtra("WXResulte",-2);
break;
}
this.sendBroadcast(intent);
this.finish();
}
}
第四步:实现支付代码:
//微信支付
public static void payWeixin(Context context,IWXAPI api,JSONObject wxJSONObject) {
boolean isPaySupported = api.getWXAppSupportAPI() >= com.tencent.mm.sdk.constants.Build.PAY_SUPPORTED_SDK_INT;
if (!isPaySupported) {
Toast.makeText(context, "您的手机暂不支持微信支付,请获取最新版本的微信客户端", Toast.LENGTH_SHORT).show();
return;
}
if (wxJSONObject.length() > 0) {
PayReq req = new PayReq();
//req.appId = "wxf8b4f85f3a794e77"; // 测试用appId
try {
req.appId = wxJSONObject.getString("appId");
req.partnerId = wxJSONObject.getString("partnerId");
req.prepayId = wxJSONObject.getString("prepayId");
req.nonceStr = wxJSONObject.getString("nonceStr");
req.timeStamp = wxJSONObject.getString("timeStamp");
req.packageValue = wxJSONObject.getString("packageValue");
req.sign = wxJSONObject.getString("sign");
req.extData = "app data"; // optional
api.sendReq(req);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
PS:参数wxJSONObject主要是接口获取的微信用户的相关信息
PS:支付宝支付和微信支付Debug模式下是测试失败的,要想测试功能,一定要签名好的APK。