android 支付宝工具类,android支付宝,微信支付集成工具类

详细的介绍、解释移步微信、支付宝的开发平台。下载官方demo了解更多。需要注意的是,微信的官方demo还是eclipse版的。

实现步骤

1.添加相关的引用(微信,支付宝)

主要是在libs目录下,添加支付宝sdkjar包,同时在gradle文件中添加依赖。如下图所示

46e8add200c4

image.png

2.配置微信回调的activity(支付宝的在第一步已经完成了)

微信支付需要创建一个包名为wxapi,并且必须放置在applicationId下面,随便放到一个包下的话,会导致支付之后,拿不到回调,如下图

46e8add200c4

image.png

WXPayEntryActivity,主要是对onResp()的方法重写,参见官方的demo,自己的全部代码为:

package com.example.user.paydemo.wxapi;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.os.Handler;

import android.support.annotation.Nullable;

import android.support.v7.app.AppCompatActivity;

import android.widget.RelativeLayout;

import com.example.user.paydemo.AppManager;

import com.example.user.paydemo.MainActivity;

import com.example.user.paydemo.PayUtils;

import com.tencent.mm.opensdk.modelbase.BaseReq;

import com.tencent.mm.opensdk.modelbase.BaseResp;

import com.tencent.mm.opensdk.modelpay.PayResp;

import com.tencent.mm.opensdk.openapi.IWXAPI;

import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;

import com.tencent.mm.opensdk.openapi.WXAPIFactory;

/**

* 微信回调页面

*/

public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

private IWXAPI api;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new RelativeLayout(this));

api = WXAPIFactory.createWXAPI(this, PayUtils.WECHAT_APP_ID);

api.handleIntent(getIntent(), this);

}

@Override

protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);

setIntent(intent);

api.handleIntent(intent, this);

}

@Override

public void onReq(BaseReq baseReq) {

}

@Override

public void onResp(BaseResp baseResp) {

int code = baseResp.errCode;

// LogUtils.LOG_D(PayUtils.class, "返回的code=" + code);

PayResp payResp = (PayResp) baseResp;

switch (code) {

case 0://支付成功后的界面

paySucess(payResp);

finish();

break;

case -1:

// showToast("签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、您的微信账号异常等。");

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

finish();

}

}, 1500);

break;

case -2://用户取消支付后的界面

// mPresenter.payCancle();取消支付处理方法类似paySucess()

finish();

break;

}

}

private void paySucess(PayResp payResp) {

//从activity栈中取出需要支付页面

Activity activity = AppManager.getBaseActivity(MainActivity.class);

if (activity != null && !activity.isFinishing()) {

MainActivity payActivity = (MainActivity) activity;

payActivity.wxPaySuccess(payResp);

}

}

}

至此,支付宝和微信的配置就完成了。

接下来是配置支付工具类了。目录结构如下:

46e8add200c4

image.png

AlipayEntity全部代码:

package com.example.user.paydemo.bean;

import com.google.gson.annotations.Expose;

/**

* 调起支付宝支付的实体类

*/

public class AlipayEntity {

@Expose

private String orderstring;

@Expose

private String orderid;

public String getOrderstring() {

return orderstring;

}

public AlipayEntity setOrderstring(String orderstring) {

this.orderstring = orderstring;

return this;

}

public String getOrderid() {

return orderid;

}

public AlipayEntity setOrderid(String orderid) {

this.orderid = orderid;

return this;

}

}

WxPayEntity 全部代码:

package com.example.user.paydemo.bean;

import com.google.gson.annotations.Expose;

import com.google.gson.annotations.SerializedName;

import java.io.Serializable;

/***

* 调起微信支付的实体类

*

*/

public class WxPayEntity implements Serializable{

@Expose

private String prepay_id;

@Expose

private String orderid;

@Expose

private String noncestr;

@Expose

private String timestamp;

@Expose

private String sign;

@SerializedName("package")

private String packageName = "Sign=WXPay"; //固定写死

public String getPrepay_id() {

return prepay_id;

}

public WxPayEntity setPrepay_id(String prepay_id) {

this.prepay_id = prepay_id;

return this;

}

public String getOrderid() {

return orderid;

}

public WxPayEntity setOrderid(String orderid) {

this.orderid = orderid;

return this;

}

public String getNoncestr() {

return noncestr;

}

public WxPayEntity setNoncestr(String noncestr) {

this.noncestr = noncestr;

return this;

}

public String getTimestamp() {

return timestamp;

}

public WxPayEntity setTimestamp(String timestamp) {

this.timestamp = timestamp;

return this;

}

public String getSign() {

return sign;

}

public WxPayEntity setSign(String sign) {

this.sign = sign;

return this;

}

public String getPackageName() {

return packageName;

}

public WxPayEntity setPackageName(String packageName) {

this.packageName = packageName;

return this;

}

}

PayZfbResultEntity代码:

package com.example.user.paydemo.bean;

/**

* Created by xiaodi on 2017/5/27.

*/

public class PayZfbResultEntity {

public PayResult payResult;

public String orderid;

}

PayResult代码:

package com.example.user.paydemo.bean;

import android.text.TextUtils;

import java.util.Map;

public class PayResult {

private String resultStatus;

private String result;

private String memo;

public PayResult(Map rawResult) {

if (rawResult == null) {

return;

}

for (String key : rawResult.keySet()) {

if (TextUtils.equals(key, "resultStatus")) {

resultStatus = rawResult.get(key);

} else if (TextUtils.equals(key, "result")) {

result = rawResult.get(key);

} else if (TextUtils.equals(key, "memo")) {

memo = rawResult.get(key);

}

}

}

@Override

public String toString() {

return "resultStatus={" + resultStatus + "};memo={" + memo

+ "};result={" + result + "}";

}

/**

* @return the resultStatus

*/

public String getResultStatus() {

return resultStatus;

}

/**

* @return the memo

*/

public String getMemo() {

return memo;

}

/**

* @return the result

*/

public String getResult() {

return result;

}

}

PayUtils代码:

package com.example.user.paydemo;

import android.app.Activity;

import android.os.AsyncTask;

import android.os.Handler;

import android.os.Message;

import android.text.TextUtils;

import android.widget.Toast;

import com.alipay.sdk.app.PayTask;

import com.example.user.paydemo.bean.AlipayEntity;

import com.example.user.paydemo.bean.PayResult;

import com.example.user.paydemo.bean.PayZfbResultEntity;

import com.example.user.paydemo.bean.WxPayEntity;

import com.tencent.mm.opensdk.constants.Build;

import com.tencent.mm.opensdk.modelpay.PayReq;

import com.tencent.mm.opensdk.openapi.IWXAPI;

import org.json.JSONException;

import org.json.JSONObject;

import java.util.Map;

/**

* Created by user on 2018/10/16.

* 支付工具类

*/

public class PayUtils {

//开发者的appid,拿到正式的appid,就要替换

public static final String WECHAT_APP_ID = "*************";

//商户id

public static final String PARENT_ID = "*************";

private static final int SDK_PAY_FLAG = 1;

private IWXAPI api;

private Activity activity;

public PayUtils(IWXAPI api, Activity activity) {

this.activity = activity;

this.api = api;

}

Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

switch (msg.what) {

case SDK_PAY_FLAG:// 支付宝

PayZfbResultEntity payZfbResultEntity = (PayZfbResultEntity) msg.obj;

/**

对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。

*/

PayResult payResult = payZfbResultEntity.payResult;

String resultInfo = payResult.getResult();// 同步返回需要验证的信息

String resultStatus = payResult.getResultStatus();

// 判断resultStatus 为9000则代表支付成功

if (TextUtils.equals(resultStatus, "9000")) {

// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。

if (null != resultListener) {

resultListener.aliPayCallBack();

}

} else if (TextUtils.equals(resultStatus, "6001")) {

if (null != resultListener) {

resultListener.aliPayCancle();

}

} else {

// 该笔订单真实的支付结果,需要依赖服务端的异步通知。

Toast.makeText(activity, "支付失败或未安装支付宝", Toast.LENGTH_SHORT).show();

}

break;

}

}

};

/**

* 支付宝支付

*

* @param alipayEntity 服务器传回来的支付数据

*/

public void payByAliPay(final AlipayEntity alipayEntity) {

//需要处理后台服务器返回的数据信息

// 后台返回的zfb 信息

if (TextUtils.isEmpty(alipayEntity.getOrderid())) return;

Runnable payRunnable = new Runnable() {

@Override

public void run() {

PayTask alipay = new PayTask(activity);

Map result = alipay.payV2(alipayEntity.getOrderstring(), true);

PayZfbResultEntity payZfbResultEntity = new PayZfbResultEntity();

payZfbResultEntity.payResult = new PayResult(result);

payZfbResultEntity.orderid = alipayEntity.getOrderid();

try {

JSONObject jsonObject = new JSONObject(payZfbResultEntity.payResult.getResult());

// LogUtils.LOG_D(PayUtils.class, "支付宝返回结果" + jsonObject.toString());

} catch (JSONException e) {

e.printStackTrace();

}

Message msg = new Message();

msg.what = SDK_PAY_FLAG;

msg.obj = payZfbResultEntity;

mHandler.sendMessage(msg);

}

};

// 必须异步调用

Thread payThread = new Thread(payRunnable);

payThread.start();

}

/**

* 微信支付

*/

public void payByWechat(final WxPayEntity wxPayEntity) {

if (api.isWXAppInstalled() && api.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT) {

} else {

// mView.showToast("未安装微信或微信版本过低!", R.mipmap.icon_fail);

return;

}

if (null == wxPayEntity)

return;

new AsyncTask() {

@Override

protected Void doInBackground(Void... voids) {

// LogUtils.LOG_D(getClass(), "正在生成订单,请稍等.");

PayReq request = new PayReq();

//

request.appId = WECHAT_APP_ID;

request.partnerId = PARENT_ID;

// 后台返回

request.prepayId = wxPayEntity.getPrepay_id();

request.packageValue = wxPayEntity.getPackageName();

request.nonceStr = wxPayEntity.getNoncestr();

request.timeStamp = wxPayEntity.getTimestamp();

request.sign = wxPayEntity.getSign();

// LogUtils.LOG_D(getClass(), "正常调起支付.");

boolean sendReq = api.sendReq(request);

// LogUtils.LOG_D(getClass(), "支付请求发送-----" + sendReq);

return null;

}

}.execute();

}

public interface PayResultListener {

/**

* 阿里支付完成回掉

*/

void aliPayCallBack();

/**

* 取消支付

*/

void aliPayCancle();

}

private PayResultListener resultListener;

public void setResultListener(PayResultListener resultListener) {

this.resultListener = resultListener;

}

public void release() {

mHandler.removeCallbacksAndMessages(null);

}

}

payutils的用法,MainActivity的代码:

在调用支付之前一定要将app注册到微信中,即执行:api.registerApp();这个方法

调用支付宝支付的方法

payUtils.payByAliPay(alipayEntity);

需要注意的是传入的参数是服务器返回的支付宝数据的数据实体类,服务器返回的支付宝数据格式应该如下:(即message字段的数据内容通过json转换bean对象)

46e8add200c4

支付宝支付返回的数据.png

调用微信支付的方法

payUtils.payByWechat(wxPayEntity);

需要注意的是传入的参数,需要为服务器返回的微信支付数据的实体对象。服务器返回的格式应如下:(同样是将message字段部分转换成为bean对象)

46e8add200c4

微信支付返回数据格式.png

package com.example.user.paydemo;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import com.example.user.paydemo.bean.AlipayEntity;

import com.example.user.paydemo.bean.WxPayEntity;

import com.tencent.mm.opensdk.modelpay.PayResp;

import com.tencent.mm.opensdk.openapi.IWXAPI;

import com.tencent.mm.opensdk.openapi.WXAPIFactory;

public class MainActivity extends AppCompatActivity implements PayUtils.PayResultListener {

private PayUtils payUtils;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

IWXAPI api = WXAPIFactory.createWXAPI(this, PayUtils.WECHAT_APP_ID);

api.registerApp(PayUtils.WECHAT_APP_ID);// 将该app注册到微信

payUtils = new PayUtils(api, this);

String jsonData = "这个是后台返回给我们的支付数据";

//支付方式为支付宝

payByAliPay(jsonData);

//微信支付

payByWeChat(jsonData);

}

/**

* 微信支付

*

* @param jsonData 后台返回的支付数据

*/

private void payByWeChat(String jsonData) {

WxPayEntity wxPayEntity = JsonUtils.json2Object(jsonData, WxPayEntity.class);

payUtils.payByWechat(wxPayEntity);

}

/**

* 支付宝支付

*

* @param jsonData 后台返回的支付数据

*/

private void payByAliPay(String jsonData) {

//将支付数据转换成为实体对象

AlipayEntity alipayEntity = JsonUtils.json2Object(jsonData, AlipayEntity.class);

payUtils.payByAliPay(alipayEntity);

}

@Override

public void aliPayCallBack() {

//付款成功的回调

}

@Override

public void aliPayCancle() {

//取消支付的回调

}

@Override

protected void onDestroy() {

super.onDestroy();

payUtils.release();

}

/**

* 微信支付成功

*

* @param payResp

*/

public void wxPaySuccess(PayResp payResp) {

}

/**

* 微信支付取消

*/

public void wxPayCancle() {

aliPayCancle();

}

}

AppManager工具类:

package com.example.user.paydemo;

import android.app.Activity;

import android.app.ActivityManager;

import android.app.Application;

import android.content.ComponentName;

import android.content.Context;

import java.util.Stack;

/**

* App管理Activity类

*/

public class AppManager {

private static Stack activityStack = new Stack<>();

/**

* 添加Activity到堆栈

*/

public static void addActivity(Activity activity) {

activityStack.push(activity);

}

/**

* 获取当前Activity(堆栈中最后一个压入的)

*/

public static Activity currentActivity() {

ActivityManager am = (ActivityManager) activityStack.firstElement().getSystemService(Context.ACTIVITY_SERVICE);

ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

Activity activity = null;

for (Activity activityItem : activityStack) {

if (cn.getClassName().contains(activityItem.getLocalClassName())) {

activity = activityItem;

break;

}

}

return activity == null ? activityStack.lastElement() : activity;

}

/**

* 结束当前Activity(堆栈中最后一个压入的)

*/

public static void finishCurrentActivity() {

Activity activity = activityStack.pop();

activity.finish();

}

/**

* 结束指定的Activity

*/

public static void finishActivity(Activity activity) {

if (activity != null) {

if (!activity.isFinishing()) {

activity.finish();

}

}

}

/**

* 结束指定类名的Activity

*/

public static void finishActivity(Class> cls) {

Activity factivity = null;

for (Activity activity : activityStack) {

if (activity.getClass().equals(cls)) {

factivity = activity;

}

}

finishActivity(factivity);

}

/**

* 结束所有Activity

*/

public static void finishAllActivity() {

for (Activity activity : activityStack) {

if (activity != null) {

activity.finish();

activity = null;

}

}

activityStack.clear();

}

/**

* 根据class获取activity

*/

public static Activity getBaseActivity(Class cls) {

Activity baseActivity = null;

for (Activity activity : activityStack) {

if (activity.getClass().equals(cls)) {

baseActivity = activity;

}

}

return baseActivity;

}

/**

* 退出应用程序

*/

public static void AppExit(Context context) {

try {

finishAllActivity();

ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

manager.killBackgroundProcesses(context.getPackageName());

//System.exit(0);

android.os.Process.killProcess(android.os.Process.myPid());

} catch (Exception e) {

e.printStackTrace();

}

}

public static void removeActivity(Activity activity) {

activityStack.remove(activity);

if (!activity.isFinishing()) {

activity.finish();

}

}

public static Application getApplication() {

return currentActivity().getApplication();

}

}

存在这么一种情况,当用户通过杀死进程的方法关闭支付的页面回到app端的时候,我们无法获取到手机的支付状态,这个时候我们就需要后台提供一个接口,来告诉app是否支付成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值