Androd集成微信支付和支付宝支付

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhe_ge_sha_shou/article/details/83474956

前言

我们在做App的时候,可能需要接入支付功能,常见的支付有微信支付支付宝支付。这里只说明下前端的代码逻辑。

微信支付

微信支付开发文档

  1. 需要申请appId,申请的时候需要填写包名(packagename),签名等信息。

  2. 在AndroidStudio中加入依赖(as3.1.3版本)

    //微信支付
    // gradle3.0以下使用compile,以上可以api
    api 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
    
  3. 初始化支付

    private void regToWx() {
        IWXAPI api;
        WX_APP_ID = "xxxxxxxxxx";//这里写你的appId
        api = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);
        api.registerApp(WX_APP_ID);
    }
    
  4. 调起支付
    这里需要请求后台服务器返回订单信息,一一赋值就行

    IWXAPI api;
    PayReq request = new PayReq();
    request.appId = "wxd930ea5d5a258f4f";
    request.partnerId = "1900000109";
    request.prepayId= "1101000000140415649af9fc314aa427",;
    request.packageValue = "Sign=WXPay";
    request.nonceStr= "1101000000140429eb40476f8896f4c9";
    request.timeStamp= "1398746574";
    request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
    api.sendReq(request);
    
  5. 支付结果回调
    在当前包名下新建wxapi包,创建WXPayEntryActivity类,记得在清单文件中声明

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, getResources().getString(R.string.wx_appid));
        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) {
        LogUtil.d("onPayFinish, errCode = " + resp.errCode);
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            PayEvent payEvent = new PayEvent();
            payEvent.payType = PayEvent.WECHAT;
            payEvent.code = resp.errCode;// 0成功 ,-1失败, -2取消
            EventBus.getDefault().post(payEvent);//这里使用EventBus去通知支付结果
        }
        finish();
    }
}

错误码说明表

名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

支付宝支付

支付宝支付文档

  1. 需要申请appId,申请的时候需要填写包名(packagename),签名等信息。

  2. 加入依赖jar包
    支付宝依赖

  3. 调起支付

        final String orderInfo = aliEntity.payStr;   // 订单信息
        Runnable payRunnable = new Runnable() {
    
            @Override
            public void run() {
                PayTask alipay = new PayTask(Activity.this);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    
  4. 支付结果处理

 private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message 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(UserAccountRechargeActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        Toast.makeText(UserAccountRechargeActivity.this, "支付失败", 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(UserAccountRechargeActivity.this,
                                "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
                                .show();
                    } else {
                        // 其他状态值则为授权失败
                        Toast.makeText(UserAccountRechargeActivity.this,
                                "授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
                default:
                    break;
            }
        }
    };

猜你喜欢

转载自blog.csdn.net/zhe_ge_sha_shou/article/details/83474956