Android 第三方支付

前言:

作为一个Android开发,必不可少的要接触到支付功能,面对支付,我的观念还是老样子,一次接入多次使用,这就体现出了封装的必要性了,目前国内常见的支付有四个:银联银行、支付宝、微信支付、QQ钱包,下面我就来集成一下支付宝、微信支付、QQ钱包三个平台的支付。

微信支付:

流程图:

这里写图片描述

开发步骤:

  1. 后台设置
    商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。
    应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的package=”net.sourceforge.simcpux”。
    应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串。
    签名工具下载地址:
    https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk

  2. 注册APPID
    商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
    final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
    // 将该app注册到微信
    msgApi.registerApp(“wxd930ea5d5a258f4f”);

  3. 调起支付
    商户服务器生成支付订单,先调用统一下单API(详见第7节)生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:

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);

4.支付结果回调
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:

publicvoidonResp(BaseRespresp){
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(R.string.app_tip);
}
}

支付宝支付:

流程图

这里写图片描述

开发步骤:

1.导入开发资源

a、将alipaySdk-xxxxxxxx.jar包放入商户应用工程的libs目录下
b、进入商户应用工程的“Project Structure”,在app module下选择“File dependency”,将libs目录下的alipaySDK-xxxxxxxx.jar导入或者在app module下的build.gradle下手动添加依赖,如下代码所示:

dependencies {
    ......
    compile files('libs/alipaySdk-20170725.jar')
    ......
}

2.修改Manifest

a、在商户应用工程的AndroidManifest.xml文件里面添加声明:

<activity
    android:name="com.alipay.sdk.app.H5PayActivity"
    android:configChanges="orientation|keyboardHidden|navigation|screenSize"
    android:exported="false"
    android:screenOrientation="behind"
    android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>
 <activity
    android:name="com.alipay.sdk.app.H5AuthActivity"
    android:configChanges="orientation|keyboardHidden|navigation"
    android:exported="false"
    android:screenOrientation="behind"
    android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>

b、和权限声明:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3.添加混淆规则

在商户应用工程的proguard-project.txt里添加以下相关规则:

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
    <fields>;
    <methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}

至此,开发包开发资源导入完成。

4.支付接口调用

需要在新线程中调用支付接口。(可参考alipay_demo实现)
PayTask对象主要为商户提供订单支付、查询功能,及获取当前开发包版本号。
获取PayTask支付对象调用支付(支付行为需要在独立的非ui线程中执行),代码示例:

final String orderInfo = info;   // 订单信息

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(DemoActivity.this);
                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();

5.支付结果获取和处理

a、同步返回

商户应用客户端通过当前调用支付的Activity的Handler对象,通过它的回调函数获取支付结果。(可参考alipay_demo实现)
代码示例:

private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            Result result = new Result((String) msg.obj);
            Toast.makeText(DemoActivity.this, result.getResult(),
                        Toast.LENGTH_LONG).show();
        };
    };

b、异步通知

商户需要提供一个http协议的接口,包含在请求支付的入参中,其key对应notify_url。支付宝服务器在支付完成后,会以POST方式调用notify_url传输数据。

QQ钱包:

流程图:

这里写图片描述

开发步骤:

1.准备工作

(1)将“mqqopenpay.jar”复制到商户App工程的libs目录下
(2)通过OpenApiFactory工厂类获得开放Api实例:

IOpenApi openApi = OpenApiFactory.getInstance(this, APP_ID);

2.前提条件判断

调用isMobileQQSupportApi函数判断手Q是否支持QQ钱包支付:

boolean isSupport = openApi.isMobileQQSupportApi(OpenConstants.API_NAME_PAY);

3.启动QQ钱包支付

(1)初始化PayApi,并将数据填写完整:

PayApi api = new PayApi();
api.appId = APP_ID; // 在http://open.qq.com注册的AppId,参与支付签名,签名关键字key为appId
api.serialNumber = …; // 支付序号,用于标识此次支付
api.callbackScheme = …; // QQ钱包支付结果回调给urlscheme为callbackScheme的activity.,参看后续的“支付回调结果处理”
api.tokenId = …; // QQ钱包支付生成的token_id
api.pubAcc = …; // 手Q公众帐号id.参与支付签名,签名关键字key为pubAcc
api.pubAccHint = …; // 支付完成页面,展示给用户的提示语:提醒关注公众帐号
api.nonce = …; // 随机字段串,每次支付时都要不一样.参与支付签名,签名关键字key为nonce
api.timeStamp = …; // 时间戳,为1970年1月1日00:00到请求发起时间的秒数
api.bargainorId = …; // 商户号.参与支付签名,签名关键字key为bargainorId
api.sig = …; // 商户Server下发的数字签名,生成的签名串,参看“数字签名”
api.sigType = “HMAC-SHA1”; // 签名时,使用的加密方式,默认为”HMAC-SHA1”

(2)在启动QQ钱包支付前,判断一下数据是否完整,再启动QQ钱包支付:

if (api.checkParams()) {
         openApi.execApi(api);
}

4.支付回调结果处理

(1)在AndroidManifest.xml配置接支付收回的Activity,其中android:scheme建议填写规则:qwallet + APP_ID。该值在”启动QQ钱包支付”时填写在api.callbackScheme中。

示例:

<activity
    android:name="com.pay.sample.CallbackActivity"
    android:launchMode="singleTop"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="qwallet100619284"/>
    </intent-filter>
</activity>

(2)在Activity的onCreate和onNewIntent里调用OpenApi的handleIntent处理支付回调。

示例:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_callback);
    openApi = OpenApiFactory.getInstance(this, appId);
    openApi.handleIntent(getIntent(), this);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    openApi.handleIntent(intent, this);
}

(3)在Activity实现支付回调响应。

示例:

public class CallbackActivity extends Activity implements IOpenApiListener {
    @Override
    public void onOpenResponse(BaseResponse response) {
        if (response == null) {
            // 不能识别的intent
            return;
        } else {
            if (response instanceof PayResponse) {
                 // 支付回调响应
                PayResponse payResponse = (PayResponse) response;
                message = " apiName:" + payResponse.apiName
                    + " serialnumber:" + payResponse.serialNumber
                    + " isSucess:" + payResponse.isSuccess()
                    + " retCode:" + payResponse.retCode
                    + " retMsg:" + payResponse.retMsg
                    + " openId:" + payResponse.openId;
                if (payResponse.isSuccess()) {
                    // 支付成功,这个支付结果不能作为发货的依据
                } 
            }else {
                // 不能识别的响应
            }
}

下载地址:

https://download.csdn.net/download/lvluffy/10327775
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值