Android 接入微信支付宝支付

   2016-11-22 0
核心提示:注册账号,创建应用,开通微信支付,这些大家都会的。微信商户平台 APP支付文档 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1 ,如果仅按照文档来,保证每次支付结果都是-1,对,只有-1,没有任何其他信息,不得不说,坑比。APP支付时序

注册账号,创建应用,开通微信支付,这些大家都会的。

微信商户平台

APP支付文档

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1 ,如果仅按照文档来,保证每次支付结果都是-1,对,只有-1,没有任何其他信息,不得不说,坑比。

APP支付时序图

大概了解下支付流程:

Android 接入微信支付宝支付

接入SDK

引入libs

SDK下载: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1 ,将libammsdk.jar放到libs文件夹下

配置debug签名

创建应用需要填写应用签名,配置在debug下直接用的正式的key,这样就不用每次打包才能调起微信客户端

signingConfigs {
 debug {
storeFile file("你的keystore路径")
 storePassword "xxx"
 keyAlias "xxx"
 keyPassword "xxx"
 }

 release {
storeFile file("你的keystore路径")
 storePassword "xxx"
 keyAlias "xxx"
 keyPassword "xxx"
 }
}

WXPayEntryActivity

Android 接入微信支付宝支付 这个 文档没有半点介绍 ,WXPayEntryActivity是支付结束的回调,和微信分享WXEntryActivity类似,必须放在包名.wxapi下,页面可以自己写。

AndroidManifest.xml中注册

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

网络权限注册不用说了。

支付接口调用

/**
 * 微信支付
 * @paramdata接口返回
 */
privatevoidweixinPay(String data){
// 通过WXAPIFactory工厂,获取IWXAPI的实例
 IWXAPI api = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID);
// 将该app注册到微信
 api.registerApp(WEIXIN_APP_ID);
 LogUtil.d("data="+ data);
try{
 JSONObject json = newJSONObject(data);
 PayReq req = newPayReq();
 req.appId = json.getString("appid");
 req.partnerId = json.getString("partnerid");
 req.prepayId = json.getString("prepayid");
 req.nonceStr = json.getString("noncestr");
 req.timeStamp = json.getString("timestamp");
 req.packageValue = json.getString("package");
 req.sign = json.getString("sign");
 req.extData = "app data";// optional
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
 api.sendReq(req);
 } catch(JSONException e) {
 e.printStackTrace();
 }
}

为了安全,APP端调起支付的参数需要商户后台系统提供接口返回,参数说明文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2

问题

以为这样就可以调起微信客户端支付了,没有想到一直返回支付结果为-1,没有多余的信息提示,不亏是微信,Android代码就是简洁!我们看到文档返回-1的提示“可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。”,我反复检查签名、APPID均没有错误,后台也确定sign信息正确,哎,我表示很无奈,iOS也调用了,他们提示”支付场景非法“,原来是由于后台之前做web支付,trade_type没有改成APP,改了我这边就能正常调起了。

Android 接入微信支付宝支付

支付宝接入

前期准备

注册账号,创建应用,开通支付功能,这些也不说了。

接入文档

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7386797.0.0.Eky59h&treeId=59&articleId=103563&docType=1

支付交互流程

Android 接入微信支付宝支付

接入SDK

SDK下载:

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.Q5gnm8&treeId=193&articleId=104509&docType=1

将alipaySdk-xxxxxxxx.jar包放到libs文件夹下

AndroidManifest.xml

添加权限

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

添加声明

<!-- 支付宝 alipay sdk begin -->
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind">
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind">
</activity>

支付接口调用

支付行为需要在独立的非ui线程中执行,代码如下:

privateHandler mHandler =newHandler() {
@SuppressWarnings("unused")
publicvoidhandleMessage(Message msg){
switch(msg.what) {
caseSDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
 PayResult payResult = newPayResult((Map<String, String>) msg.obj);
/**
 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
 */
 String resultInfo = payResult.getResult();// 同步返回需要验证的信息
 String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if(TextUtils.equals(resultStatus,"9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
 Toast.makeText(mActivity, "支付成功", Toast.LENGTH_SHORT).show();
 } else{
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
 Toast.makeText(mActivity, payResult.getMemo(), Toast.LENGTH_SHORT).show();
 }
break;
 }

default:
break;
 }
 }

 ;
 };

/**
 * 支付宝
 */
privatevoidalipay(finalString orderInfo){
 Runnable payRunnable = newRunnable() {

@Override
publicvoidrun(){
 PayTask alipay = newPayTask(mActivity);
 Map<String, String> result = alipay.payV2(orderInfo, true);
 Log.i("msp", result.toString());

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

 Thread payThread = newThread(payRunnable);
 payThread.start();
 }

同样为了安全,这里orderInfo是后台接口返回,参数说明文档:

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.DwA283&treeId=59&articleId=103663&docType=1

这样就over了,相比于微信支付,简单的不能再简单。

 
标签: 安卓开发
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 安卓中通知功能的具体实现
    安卓中通知功能的具体实现
    通知[Notification]是Android中比较有特色的功能,当某个应用程序希望给用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知实现。使用通知的步骤1、需要一个NotificationManager来获得NotificationManager manager = (NotificationManager
    02-05 安卓开发
  • Android view系统分析-setContentView
    Android view系统分析-setContentView
    第一天上班,列了一下今年要学习的东西。主要就是深入学习Android相关的系统源代码,夯实基础。对于学习Android系统源代码,也没什么大概,就从我们平常使用最基础的东西学起,也就是从view这个切入点开始学习Android的源码,在没分析源码之前,我们有的时候
    02-05 安卓开发
  • 如何进行网络视频截图/获取视频的缩略图
    如何进行网络视频截图/获取视频的缩略图
    小编导读:获取视频的缩略图,截图正在播放的视频某一帧,是在音视频开发中,常遇到的问题。本文是主要用于点播中截图视频,同时还可以获取点播视频的缩略图进行显示,留下一个问题,如下图所示, 如果要获取直播中节目视频缩略图,该怎么做呢?(ps:直播是直
  • Android NDK 层发起 HTTP 请求的问题及解决
    Android NDK 层发起 HTTP 请求的问题及解决
    前言新的一年,大家新年快乐~~鸡年大吉!本次给大家带来何老师的最新文章~虽然何老师还在过节,但依然放心不下广大开发者,在此佳节还未结束之际,给大家带来最新的技术分享~ 事件的起因不说了,总之是需要实现一个 NDK 层的网络请求。为了多端适用,还是选择
  • Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突
    Android插件化(六): OpenAtlasの改写aapt以防
    引言Android应用程序的编译中,负责资源打包的是aapt,如果不对打包后的资源ID进行控制,就会导致插件中的资源ID冲突。所以,我们需要改写aapt的源码,以达到通过某种方式传递资源ID的Package ID,通过aapt打包时获取到这个Package ID并且应用才插件资源的命名
    02-05 安卓开发
  • Android架构(一)MVP架构在Android中的实践
    Android架构(一)MVP架构在Android中的实践
    为什么要重视程序的架构设计 对程序进行架构设计的原因,归根结底是为了 提高生产力 。通过设计是程序模块化,做到模块内部的 高聚合 和模块之间的 低耦合 (如依赖注入就是低耦合的集中体现)。 这样做的好处是使得程序开发过程中,开发人员主需要专注于一点,
    02-05 安卓开发
  • 安卓逆向系列教程 4.2 分析锁机软件
    安卓逆向系列教程 4.2 分析锁机软件
    安卓逆向系列教程 4.2 分析锁机软件 作者: 飞龙 这个教程中我们要分析一个锁机软件。像这种软件都比较简单,完全可以顺着入口看下去,但我这里还是用关键点来定位。首先这个软件的截图是这样,进入这个界面之后,除非退出模拟器,否则没办法回到桌面。上面那
    02-05 安卓开发
  • Android插件化(二):OpenAtlas插件安装过程分析
    Android插件化(二):OpenAtlas插件安装过程分析
    在前一篇博客 Android插件化(一):OpenAtlas架构以及实现原理概要 中,我们对应Android插件化存在的问题,实现原理,以及目前的实现方案进行了简单的叙述。从这篇开始,我们要深入到OpenAtlas的源码中进行插件安装过程的分析。 插件的安装分为3种:宿主启动时立
    02-05 安卓开发
  • [译] Android API 指南
    [译] Android API 指南
    众所周知,Android开发者有中文网站了,API 指南一眼看去最左侧的菜单都是中文,然而点进去内容还是很多是英文,并没有全部翻译,我这里整理了API 指南的目录,便于查看,如果之前还没有通读,现在可以好好看一遍。注意,如果标题带有英文,说明官方还没有翻
  • 使用FileProvider解决file:// URI引起的FileUriExposedException
    使用FileProvider解决file:// URI引起的FileUri
    问题以下是一段简单的代码,它调用系统的相机app来拍摄照片:void takePhoto(String cameraPhotoPath) {File cameraPhoto = new File(cameraPhotoPath);Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);takePhotoIntent.putExtra(Medi
    02-05 安卓开发
点击排行