今天想跟大家分享一下Android开发中的支付功能,基本上所有的商城类项目都会用到微信支付,支付宝支付,相信很多初学者在开发的过程中也曾遇到跟我一样的情况:看完开发文档之后,做出来的功能怎么调用不起来,经过后来的反复调试才成功的完成支付功能,下面我就简单的来说说微信支付和支付宝支付的注意事项。

项目的下载链接我也放在结尾,有需要的朋友可以下载看看,欢迎大家提出意见。


微信支付注意事项:

1.创建项目的时候填写的应用包名,相信这个没有开发者会出错。

2.创建项目的时候填写的签名文件的签名串,填写的是签名文件的MD5值,值得注意的是,微信要求去掉MD5值当中的冒号,并且改大写为小写,当初我就是在这个上面犯了错,当时的微信文档也没有仔细说明。、

3.完成功能测试的时候,需要使用签名文件签名后的APK进行测试,否则会调用不起来。(不使用签名文件签名,有可能能调起第一次支付,后面就调用不起来了)

4.检查核对APP_ID是否正确,在项目过程中有多个地方需要用到APP_ID,AndroidManifest文件中也需要使用到。


支付宝支付注意事项:

1.其实支付宝支付挺简单的,没有微信那么复杂,只要检查key以及公钥和私钥的正确性就行了,然后按照demo来一步步集成就能实现功能了。


下面不多说废话了,上代码说明:‘’

xml文件就两个按钮,就不贴出来了,直接上java代码:

微信支付代码:


// 微信支付必须参数
    String appId = "wxd930ea5d5a258f4f";
    String partnerId = "";
    String prepayId = "";
    String packageValue = "";
    String nonceStr = "";
    String timeStamp = "";
    String sign = "";

这是

微信支付需要的参数,少一个或者有一个值为空都不行,参数是有了,下面就是发起微信支付了,这里我自己写了工具类WXPayHelper 用来封装微信支付,这样方便在多个地方调用微信支付功能。


/**
     * 发起微信支付
     */
    private void toWxPay(){
        PayConfig payConfig = new PayConfig();
        payConfig.setAppid(appId);
        payConfig.setPartnerid(partnerId);
        payConfig.setNoncestr(nonceStr);
        payConfig.setPrepayid(prepayId);
        payConfig.setPack(packageValue);
        payConfig.setPaySign(sign);
        payConfig.setTimestamp(timeStamp);

        WXPayHelper payHelper = new WXPayHelper(this);
        payHelper.doPay(payConfig);
    }

下面是

WXPayHelper工具类中的操作:


/**
	 * 使用后台返回的支付参数支付
	 * 
	 * @param payConfig
	 */
	public void doPay(PayConfig payConfig) {

		req.appId = payConfig.getAppid();
		req.partnerId = payConfig.getPartnerid();
		req.prepayId = payConfig.getPrepayid();
		req.packageValue = payConfig.getPack();
		req.nonceStr = payConfig.getNoncestr();
		req.timeStamp = payConfig.getTimestamp();
		req.sign = payConfig.getPaySign();

		PayReq request = new PayReq();
		request.appId = req.appId;
		request.partnerId = req.partnerId;
		request.prepayId= req.prepayId;
		request.packageValue = req.packageValue;
		request.nonceStr= req.nonceStr;
		request.timeStamp= req.timeStamp;
		request.sign= req.sign;

		// 发起支付
		msgApi.sendReq(req);
	}

支付结果在回调页面WXPayEntryActivity展示:


/**
     * 支付结果回调
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            int code = resp.errCode;
            switch (code) {
                case 0: // 支付成功

                    break;
                case -1: // 支付失败

                    break;
                case -2: // 支付取消

                    break;

                default:
                    break;
            }
        }
    }

AndroidManifest文件中需要注册:


<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="wxd930ea5d5a258f4f" />
            </intent-filter>
        </activity>

        <!-- 将APP注册到微信 -->
        <receiver android:name=".wxapi.AppRegister" >
            <intent-filter>
                <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
            </intent-filter>
        </receiver>

        <!-- 微信支付回调 -->
        <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:screenOrientation="portrait" />

好了,微信支付功能基本上就实现了



下面我们讲讲支付宝支付:



// 支付宝支付
    String payData = "";

支付宝支付的参数,在这里我为什么只用一个参数呢,我这里跟支付宝官网给出的demo有点不一样,demo的参数是全部分开的,一个一个嵌入,而我这里只传了一个payData参数是因为后台人员已经把支付宝支付所需参数拼接好返回给前端了,所以对于支付宝怎么传参数,就看开发者自己定义了

private void getAilPay(String payData) {
        // 完整的符合支付宝参数规范的订单信息
        final String payInfo = payData;
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask(MainActivity.this);
                // 调用支付接口,获取支付结果
                String result = alipay.pay(payInfo);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

发起支付宝支付,这一步在支付宝的demo上也有,下面就是回调了

@Override
    public boolean 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")) {
                    Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                } else {
                    // 判断resultStatus 为非“9000”则代表可能支付失败
                    // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
                    if (TextUtils.equals(resultStatus, "8000")) {
                        Toast.makeText(MainActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
                    } else {
                        // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
                        Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
                    }
                }
                break;
            }
            case SDK_CHECK_FLAG: {
                Toast.makeText(MainActivity.this, "检查结果为:" + msg.obj, Toast.LENGTH_SHORT).show();
                break;
            }
        }
        return false;
    }

AndroidManifest文件中需要注册:

<!-- 支付宝支付回调 -->
        <!-- alipay sdk begin -->
        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" >
        </activity>
        <!-- alipay sdk end -->



支付宝支付到这里也就完成了,有需要的朋友可以下载demo看看



Android 对接支付宝 android 微信支付宝支付流程_android