Android 集成微信支付和支付宝支付工具类
Android 集成微信支付和支付宝支付工具类
1.前言
去年年底接了一个商城app 外包项目,里面尼涉及到 微信和支付宝支付,这里我整理出几个工具类,下面就和大家分享一下,废话不多说,下面我一步一步给大家介绍下。
一、支付宝支付
1.支付宝官方集成文档
2.支付宝官方资源下载
二、微信支付
1.微信官方的集成文档
2.微信官方资源下载
三、下面我直接上代码了哈
首先导入对应支付平台下载的SDK里面的jar
1.PayHelper 支付类:
package com.more.org.utils;import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;import com.alipay.sdk.app.PayTask;
import com.more.org.WEXModel;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;import java.util.Map;/*** Created by Administrator on 2017/5/23.* 支付类*/public class PayHelper {private static PayHelper mPayHelper = null;public static PayHelper getInstance() {if (mPayHelper == null) {mPayHelper = new PayHelper();}return mPayHelper;}public PayHelper() {}IWXAPI msgApi = null;public void WexPay(WEXModel.ReturnDataBean data) {if (msgApi == null) {msgApi = WXAPIFactory.createWXAPI(MyApplication.getInstance(), null);msgApi.registerApp(Constant.WEXAPPID);// 将该app注册到微信}PayReq req = new PayReq();if (!msgApi.isWXAppInstalled()) {Toast.makeText(MyApplication.getInstance(), "手机中没有安装微信客户端!", Toast.LENGTH_SHORT).show();return;}if (data != null) {req.appId = data.getAppid();req.partnerId = data.getPartnerid();req.prepayId = data.getPrepayid();req.nonceStr = data.getNoncestr();req.timeStamp = data.getTimestamp() + "";req.packageValue = data.getPackageX();req.sign = data.getSign();// req.extData = MaiLiApplication.getInstance().getUserInfo().getPhone(); 微信拓展参数msgApi.sendReq(req);}}public void AliPay(Activity activity, final String orderInfo) {final PayTask alipay = new PayTask(activity);Runnable payRunnable = new Runnable() {@Overridepublic void run() {Map<String, String> result = alipay.payV2(orderInfo, true);Log.i("msp", result.toString());Message msg = new Message();msg.what = 0;msg.obj = result;mHandler.sendMessage(msg);}};Thread payThread = new Thread(payRunnable);payThread.start();}private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 0:PayResult payResult = new PayResult((Map<String, String>) msg.obj);/**对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。*/String resultInfo = payResult.getResult();// 同步返回需要验证的信息String resultStatus = payResult.getResultStatus();// 判断resultStatus 为9000则代表支付成功if (TextUtils.equals(resultStatus, "9000")) {// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。if (mIPayListener != null) {mIPayListener.onSuccess();}} else {// 该笔订单真实的支付结果,需要依赖服务端的异步通知。if (mIPayListener != null) {mIPayListener.onFail();}}break;}}};private IPayListener mIPayListener;public void setIPayListener(IPayListener mIPayListener) {this.mIPayListener = mIPayListener;}public interface IPayListener {void onSuccess();void onFail();}
}
2.PayResult看命名就知道 支付结果类:
package com.more.org.utils;import android.text.TextUtils;import java.util.Map;public class PayResult {private String resultStatus;private String result;private String memo;public PayResult(Map<String, String> 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);}}}@Overridepublic 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;}
}
3.WXPayEntryActivity类(放在wxapi包名下):
package com.more.org.wxapi;import android.content.Intent;
import android.widget.Toast;import com.more.org.BaseActivity;
import com.more.org.BasePresenter;
import com.more.org.R;
import com.more.org.databinding.ActivityPayResultBinding;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
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 BaseActivity<BasePresenter,ActivityPayResultBinding> implements IWXAPIEventHandler {private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";private IWXAPI api;// @Override
// public int getLayoutId() {
// return R.layout.activity_pay_result;
// }
//
// @Override
// protected boolean isTitleBar() {
// return false;
// }
//
// @Override
// protected boolean isPrestener() {
// return false;
// }
//
// @Override
// protected BasePresenter createPresenter() {
// return null;
// }
//@Overridepublic void initData() {super.initData();api = WXAPIFactory.createWXAPI(this, Constant.WEXAPPID);api.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {int code = resp.errCode;String transaction = resp.transaction;String errStr = resp.errStr;if (code == 0) {mBinding.tvResult.setText("充值成功了!");//显示充值成功的页面和需要的操作//EventBus.getDefault().post("微信支付成功");//微信支付成功Toast.makeText(aty, "充值成功了!", Toast.LENGTH_SHORT).show();}if (code == -1) {//错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。mBinding.tvResult.setText("充值失败!");Toast.makeText(aty, "充值失败!", Toast.LENGTH_SHORT).show();}if (code == -2) {mBinding.tvResult.setText("用户取消了!");Toast.makeText(aty, "用户取消了!", Toast.LENGTH_SHORT).show();//用户取消}// finish();}
}
4.WEXModel实体类:(根据自己服务器返回的数据定义)
package com.more.org;import com.google.gson.annotations.SerializedName;import java.io.Serializable;
import java.util.List;/*** Created by Administrator on 2017/5/23.*/public class WEXModel implements Serializable {/*** ReturnCode : 1* ReturnMessage :* ReturnData : 服务器返回的josn数据*/private String ReturnCode;private String ReturnMessage;private List<ReturnDataBean> ReturnData;public String getReturnCode() {return ReturnCode;}public void setReturnCode(String ReturnCode) {this.ReturnCode = ReturnCode;}public String getReturnMessage() {return ReturnMessage;}public void setReturnMessage(String ReturnMessage) {this.ReturnMessage = ReturnMessage;}public List<ReturnDataBean> getReturnData() {return ReturnData;}public void setReturnData(List<ReturnDataBean> ReturnData) {this.ReturnData = ReturnData;}public static class ReturnDataBean {/*** appid : //对应的参数后台返回* partnerid : * prepayid : * package : Sign=WXPay* noncestr : * timestamp : 1521789303* sign : */private String appid;private String partnerid;private String prepayid;@SerializedName("package")private String packageX;private String noncestr;private String timestamp;private String sign;public String getAppid() {return appid;}public void setAppid(String appid) {this.appid = appid;}public String getPartnerid() {return partnerid;}public void setPartnerid(String partnerid) {this.partnerid = partnerid;}public String getPrepayid() {return prepayid;}public void setPrepayid(String prepayid) {this.prepayid = prepayid;}public String getPackageX() {return packageX;}public void setPackageX(String packageX) {this.packageX = packageX;}public String getNoncestr() {return noncestr;}public void setNoncestr(String noncestr) {this.noncestr = noncestr;}public String getTimestamp() {return timestamp;}public void setTimestamp(String timestamp) {this.timestamp = timestamp;}public String getSign() {return sign;}public void setSign(String sign) {this.sign = sign;}}
}
5.AndroidManifest清单文件配置相关信息:
1.添加必要权限
<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" />
2.注册信息
<!-- 支付宝 --><activity
android:name="com.alipay.sdk.app.H5PayActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind" /><activity
android:name="com.alipay.sdk.auth.AuthActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind" /><!-- 微信支付回调函数 --><activity
android:name=".wxapi.WXPayEntryActivity"android:exported="true"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="这里替换自己申请的scheme" /></intent-filter></activity>
6.下面我们看下调用的地方,其实很简单:
/** 支付宝支付方法* */private void initAlipay(String type) {Api.getApi().getRechargePay(CacheService.getIntance().getUserId(), payMoney, type).compose(callbackOnIOToMainThread()).subscribe(new BaseNetSubscriber<BaseBean>(true) {@Overridepublic void onNext(BaseBean baseBean) {super.onNext(baseBean);PayHelper.getInstance().AliPay(aty, String.valueOf(baseBean.getReturnData()));PayHelper.getInstance().setIPayListener(new PayHelper.IPayListener() {@Overridepublic void onSuccess() {showToast("支付成功!");new Thread() {@Overridepublic void run() {super.run();try {sleep(1000);} catch (InterruptedException e) {}EventBus.getDefault().post(new MineUpdateEvent());//更新价格finish();}}.start();}@Overridepublic void onFail() {showToast("支付失败!");}});}@Overridepublic void onError(Throwable e) {super.onError(e);}});}/** 微信支付方法* */private void initWexPay(String type) {Api.getApi().getRechargePay1(CacheService.getIntance().getUserId(), payMoney, type).compose(callbackOnIOToMainThread()).subscribe(new BaseNetSubscriber<WEXModel>(true) {@Overridepublic void onNext(WEXModel wexModel) {super.onNext(wexModel);if (wexModel.getReturnData() != null && wexModel.getReturnData().size() > 0) {PayHelper.getInstance().WexPay(wexModel.getReturnData().get(0));} else {showToast("信息错误!");}}@Overridepublic void onError(Throwable e) {super.onError(e);}});}
以上就是微信支付和支付宝支付所有代码了,哈哈是不是发现好简单!
关于微信的签名要说明的问题:
1.首先按照微信的签名的话,一般步骤都可以往下走,但是有一点需要注意就是签完名之后,如果你打包成正式版的话也就是releasea签名的话要用正式的包安装才能唤起微信,否则会出错的,如果要是想使用Dug签名的话,你要把签名后的keystore替换掉android studio的默认签名就可以使用了。
2.上面这些类是我从自己项目整理出来的,你们拿来用,稍微改下就行。
2.一般来说 遇到比较多问题 返回 -1,这种问题网上也有对应的链接解决的,比如参数配置,后台返回的信息是不是有问题,这些小伙伴们注意一下就ok啦.
好啦以上就分享到这里,平时我也比较懒,博客写的少,哈哈,哪里写的不好的地方 希望各位大神多多指教,有好的建议留言或者 加qq** 2585760090 (记得备注下哈)**
Android 集成微信支付和支付宝支付工具类相关推荐
- Android 集成微信支付和支付宝
最近比较闲,公司项目更换后台,于是自己来研究微信支付和支付宝支付,把自己学习的过程写下来,以备以后查看. 注:要集成微信支付和支付宝功能,必须要有以下几个配置信息,而这写信息需要公司去微信支付和支付宝 ...
- 安卓 集成微信支付和支付宝
最近比较闲,公司项目更换后台,于是自己来研究微信支付和支付宝支付,把自己学习的过程写下来,以备以后查看. 注:要集成微信支付和支付宝功能,必须要有以下几个配置信息,而这写信息需要公司去微信支付和支付宝 ...
- Android集成微信支付
Android集成微信支付 项目中集成第三方支付的功能,基本是我们app中经常用到的功能.今天先给大家讲一下微信支付的集成过程,重点只说一下代码部分.首先,你要到微信开发者平台注册账号,并创建你的应用 ...
- Android集成微信支付之-天坑
项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 1 支付结果回调(图中的17步) 支付结果回调,微信官方的说法是: ...
- android微信迁移数据,【CSDN博客迁移】Android集成微信支付之-天坑
项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 微信支付业务流程.png 1 支付结果回调(图中的17步) 支付结果 ...
- Android 集成微信支付详解
打包后才能起调支付 微信支付成功起调 微信skd下载:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1 签名APK下载:h ...
- Android集成微信支付跳坑指南
1. 前言 "好记性不如烂笔头",现在 平常 碰到的一些知识点都是直接复制到印象笔记中,但是那些资料都比较零散,该总结的还得总结.前段时间完成了在线支付的微信支付,趁着一些注意地方 ...
- 【Java】快速集成微信支付和支付宝支付
本文介绍博主自己封装的一个微信支付和支付宝支付的library apppay_library:https://github.com/gumingwei/app_pay 本项目解决的问题仅限于最后的支付 ...
- IOS集成微信支付或者支付宝支付功能小结
2019独角兽企业重金招聘Python工程师标准>>> 第一,你需要有微信开发平台的开发者账号,(网址https://open.weixin.qq.com/,或者自行百度" ...
最新文章
- 开发日记-20190617 关键词 bash命令尝试模拟点击事件
- Excessive growth of the primary database log mirror and system Performance Monitoring
- 挑战独立开发项目能力___ITlanbao
- 手机软件:杀手游戏的法官助手,(人多的时候法官没有辅助,是很难记住各个角色的)...
- 醉了,RPC 超时设置也能引起线上事故!
- [云炬创业基础笔记] 创业机会的评价标准与SWOT分析
- Java 数组插入元素
- python用什么来写模块-Python 3.1 用C写模块 扩展(序)
- 高等数学课后答案上册同济大学第七版第一章答案
- 数据库系统概念第六版 第六章练习题6.11
- mysql获取姓名拼音首字母_C# 汉字获取拼音首字母,给数据库中的姓名添加首字母...
- 拉格朗日对偶问题一定是凸优化问题的证明
- hadoop的map和reduce
- 边缘的容器化 — WasmEdge 与 seL4
- Matlab自适应均线_DMA指标(离差移动平均)matlab源代码
- android 清理缓存功能 的实现,android实现清理缓存功能
- win7关闭系统索引服务器,如何关闭Windows7系统中的索引功能
- 思科服务器如何配置文件,思科服务器的配置方法
- 汽车钥匙改装成手机蓝牙无钥匙进入一键启动 ,汽车无钥匙进入为何不能集成到手机?蓝牙无钥匙进入一键启动解决方案
- getdate、dateadd、datediff、datename、datepart关于日期函数的用法及理解