android应用集成支付宝接口的简化

Android 集成支付宝支付,支付宝支付2(1) 我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。// 8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态。 阅读详情

拿到支付宝的andriod demo后有点无语,集成一个支付服务而已,要在十几个java类之间引用来引用去。。。

不仅容易导致应用本身代码结构的复杂化,调试起来也很累,于是操刀予以改造:

该删的删,该改写的改写,MobileSecurePayer之外的内容全部整合到MobileSecurePayerHelper之中

 

/*
 * Copyright (C) 2010 The MobileSecurePay Project
 * All right reserved.
 * author: shiqun.shi@alipay.com

 *modify: fangle
 */

package com.alipay.android;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;

import javax.crypto.Cipher;

import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Base64;

public class MobileSecurePayHelper
{
 static final String TAG="MobileSecurePayHelper";

 public static final String PARTNER="";
 public static final String SELLER="";
 public static final String RSA_PRIVATE="";
 public static final String RSA_ALIPAY_PUBLIC="";

 Context mContext=null;
 Handler mHandler=null;
 String mUrl=null;
 String mPath=null;
 
 public static String Stream2String(InputStream is)
 {
  BufferedReader reader=new BufferedReader(new InputStreamReader(is));
  StringBuilder sb=new StringBuilder();
  String line=null;
  try
  {
   while((line=reader.readLine())!=null)sb.append(line);
   is.close();
  }
  catch(IOException e){e.printStackTrace();}
  return sb.toString();
 }
 
 public static JSONObject string2JSON(String str,String split)
 {
  JSONObject json=new JSONObject();
  try
  {
   String[] arrStr=str.split(split);
   for(int i=0;i<arrStr.length;i++)
   {
    String[] arrKeyValue=arrStr[i].split("=");
    json.put(arrKeyValue[0],arrStr[i].substring(arrKeyValue[0].length()+1));
   }
  }
  catch(Exception e){e.printStackTrace();}
  return json;
 } 
 
 public static String SendAndWaitResponse(String strReqData,String strUrl)
 {
  String strResponse=null;
  ArrayList<BasicNameValuePair> pairs=new ArrayList<BasicNameValuePair>();
  pairs.add(new BasicNameValuePair("requestData",strReqData));
  
  HttpURLConnection conn=null;
  UrlEncodedFormEntity p_entity;
  try
  {
   p_entity=new UrlEncodedFormEntity(pairs,"utf-8");
   URL url=new URL(strUrl);
   conn=(HttpURLConnection)url.openConnection();
   conn.setConnectTimeout(30*1000);
   conn.setReadTimeout(30*1000);
   conn.setDoOutput(true);
   conn.addRequestProperty("Content-type","application/x-www-form-urlencoded;charset=utf-8");
   conn.connect();
   
   OutputStream os=conn.getOutputStream();
   p_entity.writeTo(os);
   os.flush();
   InputStream content=conn.getInputStream();
   strResponse=Stream2String(content);
  }
  catch(IOException e){e.printStackTrace();}
  finally{conn.disconnect();}
  return strResponse;
 } 
 
 public static boolean urlDownloadToFile(Context context,String strurl,String path)
 {
  boolean bRet=false;
  try
  {
   URL url=new URL(strurl);
   HttpURLConnection conn=null;
   conn=(HttpURLConnection)url.openConnection();
   conn.setConnectTimeout(30*1000);
   conn.setReadTimeout(30*1000);
   conn.setDoInput(true);
   conn.connect();
   InputStream is=conn.getInputStream();
   File file=new File(path);
   file.createNewFile();
   FileOutputStream fos=new FileOutputStream(file);
   byte[] temp=new byte[1024];
   int i=0;
   while((i=is.read(temp))>0)fos.write(temp,0,i);
   fos.close();
   is.close();
   bRet=true;
  }
  catch(IOException e){e.printStackTrace();}
  return bRet;
 }
 
 public static String RsaEncode(String content,String key)
 {
  try
  {
   X509EncodedKeySpec x509=new X509EncodedKeySpec(Base64.decode(key,Base64.DEFAULT));
   KeyFactory kf=KeyFactory.getInstance("RSA");  
   PublicKey pubKey=kf.generatePublic(x509);
   Cipher cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
   cipher.init(Cipher.ENCRYPT_MODE,pubKey);
   byte plaintext[]=content.getBytes("UTF-8");
   byte[] output=cipher.doFinal(plaintext);
   return new String(Base64.encode(output,Base64.DEFAULT));
  }
  catch(Exception e){e.printStackTrace();}
  return null;
 }
 
 public static String RsaSign(String content,String privateKey)
 {
        try
        {
         PKCS8EncodedKeySpec pkcs8=new PKCS8EncodedKeySpec(Base64.decode(privateKey,Base64.DEFAULT));
         KeyFactory kf=KeyFactory.getInstance("RSA");
         PrivateKey priKey=kf.generatePrivate(pkcs8);
            Signature signature=Signature.getInstance("SHA1WithRSA");
            signature.initSign(priKey);
            signature.update(content.getBytes("utf-8"));
            byte[] signed=signature.sign();
            return new String(Base64.encode(signed,Base64.DEFAULT));
        }
        catch(Exception e){e.printStackTrace();}
        return null;
    }
 
 public static boolean RsaCheck(String content, String sign, String publicKey)
 {
  try
  {
   KeyFactory keyFactory=KeyFactory.getInstance("RSA");
         byte[] encodedKey=Base64.decode(publicKey,Base64.DEFAULT);
         PublicKey pubKey=keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
   Signature signature=Signature.getInstance("SHA1WithRSA");
   signature.initVerify(pubKey);
   signature.update(content.getBytes("utf-8"));
   boolean bverify=signature.verify(Base64.decode(sign,Base64.DEFAULT));
   return bverify;
  }
  catch(Exception e){e.printStackTrace();}
  return false;
 }

 public MobileSecurePayHelper(Context context,Handler handler)
 {
  mContext=context;
  mHandler=handler;
 }

 public boolean detectService()
 {
  boolean isExist=false;
  List<PackageInfo> pkgList=mContext.getPackageManager().getInstalledPackages(0);
  for(int i=0;i<pkgList.size();i++)
  {
   if(pkgList.get(i).packageName.equalsIgnoreCase("com.alipay.android.app"))isExist=true;
  }
  return isExist;
 }
 
 public void downloadAliMSP()
 {
  JSONObject Resp=null;
  try
  {
   JSONObject req=new JSONObject();
   req.put("action","update");
   JSONObject data=new JSONObject();
   data.put("platform","android");
   data.put("version","2.2.3");
   data.put("partner","");
   req.put("data",data);
   Resp=new JSONObject(SendAndWaitResponse(req.toString(),"https://msp.alipay.com/x.htm"));
   mUrl=Resp.getString("updateUrl");
  }
  catch(JSONException e)
  {
   e.printStackTrace();
   return;
  }
  new Thread(new Runnable()
  {
   public void run()
   {
    mPath=mContext.getCacheDir().getAbsolutePath()+"/temp.apk";
    urlDownloadToFile(mContext,mUrl,mPath);
    Message msg=new Message();
    msg.what=2;
    mHandler.sendMessage(msg);
   }
  }).start();
 }

 public void installAliMSP()
 {
  if(mPath==null)return;
  try{Runtime.getRuntime().exec("chmod 777 "+mPath);}
  catch(IOException e){e.printStackTrace();}
  Intent intent=new Intent(Intent.ACTION_VIEW);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  intent.setDataAndType(Uri.parse("file://"+mPath),"application/vnd.android.package-archive");
  mContext.startActivity(intent);
 }
}

 

集成很简单,一个OnClickListener负责调用支付服务,一个Handler负责处理支付过程中的相应事件:

 

 private Handler m_mspHandler=new Handler()
 {
  public void handleMessage(Message m)
  {           
   //1:支付返回
   //2:支付组件下载完成
   TextView tv=(TextView)findViewById(R.id.order_tips);
   Button bt=(Button)findViewById(R.id.order_ok);
   ProgressBar pb=(ProgressBar)findViewById(R.id.order_wait);
   switch(m.what)
   {
   case 1:
    String ret=(String)m.obj;
    String memo="memo={";
    int start=ret.indexOf(memo)+memo.length();
    int end=ret.indexOf("};result=");
    memo=ret.substring(start,end);
    m_tips+=memo;
    if(memo.indexOf("付款成功")>=0)m_tips+="\r\n请注意查看短信,您将收到二维码凭证";
    tv.setText(m_tips);
    bt.setVisibility(0);
    pb.setVisibility(4);
    break;
   case 2:
    m_tips+="安全支付组件下载完成,开始安装...\r\n";
    tv.setText(m_tips);
    m_mspHelper.installAliMSP();
    bt.setVisibility(0);
    pb.setVisibility(4);
    break;
   }
  }
 };
 
 private OnClickListener m_orderButtonListener=new OnClickListener()
 {
     public void onClick(View v)
     {
      String mobile=m_mobileEdt.getText().toString();
      m_tips="";
      TextView tv=(TextView)findViewById(R.id.order_tips);
      Button bt=(Button)findViewById(R.id.order_ok);
      ProgressBar pb=(ProgressBar)findViewById(R.id.order_wait);
      if(mobile.length()!=11)
      {
       m_tips+="无效的收货号码\r\n";
       tv.setText(m_tips);
       return;
      }
      if(!m_date.after(m_today))
      {
       m_tips+="订货日期不能早于明天\r\n";
       tv.setText(m_tips);
       return;
      }
      SoapObject request=new SoapObject("http://airtimes.cn/","MakeOrder");
      request.addProperty("Uname",m_intent.getStringExtra("userid"));
      request.addProperty("ProductId",m_intent.getStringExtra("item_PID"));
      request.addProperty("Sum","1");
      request.addProperty("PayAmount",m_intent.getStringExtra("item_price"));
      request.addProperty("SMSMobile",mobile);
      request.addProperty("ExpireDate",String.format("%04d-%02d-%02d",m_date.get(1),m_date.get(2)+1,m_date.get(5)));
      
      //显示等待条,提交订单信息
      m_tips+="正在创建订单,请稍候...\r\n";
      tv.setText(m_tips);
      bt.setVisibility(4);
      pb.setVisibility(0);
      
      HttpTransportSE httpTransport=new HttpTransportSE("http://****/serv.asmx");
         SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
         envelope.dotNet=true;
         envelope.bodyOut=request;
         String respond;
         try
         {
          httpTransport.call(request.getNamespace()+request.getName(),envelope);
          if(envelope.getResponse()!=null)respond=envelope.getResponse().toString();
          else respond="false,null";
         }
         catch(Exception ex){respond="false,"+ex.getMessage();}
      if(respond.substring(0,5).equals("false"))
      {
    m_tips+="创建订单失败:"+respond.substring(6)+"\r\n";
       tv.setText(m_tips);
    bt.setVisibility(0);
    pb.setVisibility(4);
    return;
   }

      String msgs[]=respond.split("[,]");
   String order;
   m_tips+="创建订单成功,开始支付...\r\n";
   tv.setText(m_tips);
    
      if(!m_mspHelper.detectService())
      {
       m_tips+="未安装安全支付组件,开始下载...\r\n";
       tv.setText(m_tips);
       m_mspHelper.downloadAliMSP();
       return;
      }
        
      order=String.format("partner=\"%s\"",MobileSecurePayHelper.PARTNER);
      order+=String.format("&seller=\"%s\"",MobileSecurePayHelper.SELLER);
      order+=String.format("&out_trade_no=\"%s\"",msgs[1]);
      order+=String.format("&subject=\"%s\"",m_intent.getStringExtra("item_type"));
      order+=String.format("&body=\"%s\"",m_intent.getStringExtra("item_name"));
      order+=String.format("&total_fee=\"%s\"",m_intent.getStringExtra("item_price"));
      order+=String.format("&notify_url=\"%s\"","http://****/alipay.aspx");
      String sign=URLEncoder.encode(MobileSecurePayHelper.RsaSign(order,MobileSecurePayHelper.RSA_PRIVATE));
      order+=String.format("&sign=\"%s\"",sign);
      order+=String.format("&sign_type=\"%s\"","RSA");
       
      com.alipay.android.MobileSecurePayer msp=new com.alipay.android.MobileSecurePayer();
      if(!msp.pay(order,m_mspHandler,1,OrderingActivity.this))
      {
       m_tips+="调用安全支付服务失败\r\n";
       tv.setText(m_tips);
    bt.setVisibility(0);
    pb.setVisibility(4);
    return;
      }
    }
 };

 

 

 

Android 集成实现支付宝支付功能        先来说些废话 , 现在在这个互联网时代 ,  网购、直播、美食等大量App 都已经离不开线上支付了 ,  使用支付宝和微信支付    毫无疑问的成为主流 。 通过这篇文章 ,我们来详细了解 如何接入集成支付宝,实现支付宝支付功能 。    首先 , 我们到官网进行登录       这里贴出官网的链接 蚂蚁金服开放平台 .     下面来详细说明接入步骤 :第一步:创建应用并获取APP... 阅读详情

相关推荐

android 手把手教你实现集成支付宝支付功能

项目需要,需要在客户端集成支付宝接口。第一次集成,过程还是挺简单的,不过由于支付宝官方文档写的不够清晰,也是走了一些弯路,下面把过程写出来分享给大家。就研究了一下:因为使用支付宝接口,就需要到支付宝官网:注册帐号,并申请。下面讲的是申请好之后的操作。登录成功之后,   店家我的商家服务—在页面的下方找到——>签约管理—>找打 移动支付—–>点击下载集成文档—>跳到新的页面,在页面下方—>找到下

一名屌丝程序员的秘密花园 1万+

Android应用集成支付宝接口的简化

拿到支付宝接口的andriod demo后有点无语,集成一个支付服务而已,要在十几个java类之间引用来引用去,这样不仅容易导致应用本身代码结构的复杂化,调试起来也很累,于是操刀改造之: 该删的删,该改写的改写,MobileSecurePayer之外的内容全部整合到MobileSecurePayerHelper之中。 [代码]java代码: 001 /*

chuchu521的专栏 4297

Android 集成支付宝支付

***/try {/***//***/@Override// 构造PayTask 对象// 调用支付接口,获取支付结果// 必须异步调用/**同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/detail.htm?docType=1) 建议商户依赖异步通知*/// 同步返回需要验证的信息。

2401_84123232的博客 997

Android封装支付宝支付

在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。 封装的代码也很简单,就是将官网给的demo提取出一个类来方便使用。

Loader's Blog 8650

SQLite学习——Dapper初识

dapper下载:https://www.nuget.org/packages/Dapper/1.40.0

jiDxiaohuo的博客 1298

信道估计准则演进:从LS、MMSE到LMMSE的工程权衡

本文深入探讨了信道估计准则的演进历程,从LS、MMSE到LMMSE的工程权衡。通过对比分析三大经典算法的数学本质、工程实现及适用场景,揭示了在计算复杂度、实时性和性能之间的关键取舍。文章结合4G/5G基站项目实战经验,提供了算法选型的三维决策模型和前沿发展建议,为无线通信系统设计提供实用指导。

weixin_29327525的博客 284

探秘GSD_ZHIFUBAO:高效支付宝接口封装库

探秘GSD_ZHIFUBAO:高效支付宝接口封装库 项目简介 是一个由开发者gsdios创建的开源项目,旨在为Android和iOS应用提供简洁易用的支付宝接口封装。通过这个库,你可以快速集成支付宝支付功能,无需深入了解其复杂的API和文档,大大简化了开发流程。 技术分析 跨平台支持: GSD_ZHIFUBAO 支持Android和iOS两大主流移动操作系统,它采用了原生代码编写,确保在各个平...

gitblog_00019的博客 565

第二章 零差云控关节模组内部构造

对零差云控的eRob70I进行了拆解

SFY__优快云的博客 5975

android应用程序如何调用支付宝接口

最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多。          在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单。而且支付宝提供的接口一直在更新,可能支付宝那边是为了让接口更容易被调用吧,以前有些老的教程稍微跟现在接口有些不能“对号入座”,于是,我决定抽空写一篇关于调用支付宝接口的文章,跟大家分享,让大家以最快的速度掌

寂静岭 20万+

航空发动机轴承故障诊断

《航空发动机主轴承故障诊断的挑战与HIT数据集研究》 摘要: 航空发动机主轴承作为关键部件,其可靠性直接影响飞行安全。然而,主轴承故障诊断面临信号信噪比低、传输路径复杂、故障类型多样、变工况运行等挑战。哈尔滨工业大学团队开发的HIT数据集为研究提供了真实工况下的实验数据,包含正常、内圈和外圈故障三种状态,具有高仿真度和强挑战性特点。研究表明,传统诊断方法在该数据集上准确率仅71-85%,突显了诊断难度。团队提出的ISONet新方法通过输入空间过参数化技术,将诊断准确率提升至99%以上,为航空发动机轴承故障诊

tyutwuxuan的博客 996

FinRL实战:5步搞定股票量化交易策略(附Python代码)

本文详细介绍了如何使用FinRL框架,通过5个步骤构建基于深度强化学习的股票量化交易策略。内容涵盖从环境搭建、数据获取与预处理,到交易环境构建、模型训练(如PPO算法),以及策略回测评估与优化的完整流程,并提供了可运行的Python代码示例,帮助读者快速入门AI驱动的量化交易。

weixin_29062865的博客 628

android如何实现支付宝,(Android集成支付宝支付)react-native实现支付宝支付

网上关于RN的支付宝支付组件大部分都是IOS的,Android要实现支付宝支付只剩下走原生这一步了。整体思路:1、在蚂蚁金服开放平台申请应用2、在android原生集成支付宝3、封装android原生4、RN与android的通信一、准备工作1、在蚂蚁金服开放平台https://docs.open.alipay.com/204/105051/按照官方提示创建应用,添加app支付的功能。2、在审核...

weixin_29062671的博客 1493

华为AR3260路由器NAT回流配置实战:从WEB界面到命令行的完整避坑指南

本文详细解析了华为AR3260路由器NAT回流(Hairpin NAT)的配置原理与实战方法。针对内网用户无法通过公网地址访问内部服务器的常见问题,文章不仅剖析了WEB界面配置的常见报错原因,更提供了清晰、可靠且一劳永逸的命令行(CLI)配置方案与排错指南,帮助企业网络工程师彻底解决内外网访问不一致的难题。

u6v7w8x的博客 874

android开发之android应用程序如何调用支付宝接口

懒惰,只是为了更好的懒惰!

ZaneLove's blog 5274

把 LDB 讲透:SAP ABAP 逻辑数据库的结构、事件模型、动态选择与现代替代方案

摘要:SAP中的Logical Database(LDB)是一种将表组织成树形结构并统一生成选择屏幕的技术,通过事件驱动方式向报表程序传递数据。虽然被标记为过时,但在理解标准代码和优化性能方面仍有价值。LDB通过SE36事务码创建,其结构包含层级关系、选择屏幕和数据库程序。报表通过NODES声明和GET事件处理数据,支持动态选择以减少数据库访问。在S/4HANA和ABAP Cloud环境下,建议使用CDS View和ABAP SQL等现代方案替代LDB,以提升可测试性和架构清晰度。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

基于 Qt C++ 开发一套西门子量子测量系统的控制与数据采集平台

sensorIdCombo->addItems({"QTS-100-001 (温度)", "QPG-200-001 (压力)", "QDS-300-001 (位移)"});precisionTable->setHorizontalHeaderLabels({"传感器ID", "类型", "标称精度", "实际精度", "校准状态"});QWidget *dispWidget = createSensorWidget("量子位移", "mm (±1μm)", 50.0, 0.001);// 传感器状态更新。

寒寒豆豆软件公司的博客 254

android蚂蚁金服支付宝支付集成步骤

此篇仅限于android客户端集成步骤,查看全部的请转https://docs.open.alipay.com/204/105296/ 自支付宝 SDK  15.5.7 开始,打包方式更换为 AAR,替代之前的 JAR 打包,SDK 支付接口部分不变.现在就基于支付宝SDK15.5.7集成支付宝支付 首先下载新的AAR的SDK包:https://download.youkuaiyun.com/downlo...

lanrenxiaowen的博客 2914

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 软件保护之注册算法篇
下一篇: 通达信股本变迁文件(gbbq)解密方法
fangle6688
博客等级 码龄21年 44粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值