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

拿到支付宝的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;
      }
    }
 };

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android集成支付宝支付可以通过以下步骤完成。 首先,注册支付宝开发者账号并创建应用,获得必要的应用ID和密钥。 其次,将支付宝SDK导入到项目中。可以通过Gradle或手动导入方式进行。 接下来,在需要使用支付宝支付的Activity中,添加支付宝支付的逻辑。 首先,创建支付宝支付的请求参数,包括订单号、订单金额、商品名称等必要信息。然后使用支付宝提供的接口将请求参数进行签名,生成最终的支付参数。 接着,调用支付宝提供的支付接口,将支付参数传入,并设置支付结果的回调监听。用户触发支付时,将会跳转到支付宝的支付页面。 最后,在回调监听中处理支付结果。支付宝支付完成后,会通过回调返回支付结果。根据返回的支付结果,可以进行相应的操作,如更新订单状态、跳转到支付成功页面等。 需要注意的是,为了保障支付安全,建议在服务器端进行订单的签名和验签操作,避免将密钥等敏感信息暴露在客户端。 以上就是Android集成支付宝支付的基本流程,开发者可以根据具体需求进行相应的参数设置和结果处理。 ### 回答2: 在Android平台上集成支付宝支付是较为常见的一种支付方式,下面我会用300字回答这个问题。 首先,为了集成支付宝支付,我们需要在支付宝开放平台上注册一个开发者账号,并创建一个应用。然后,我们需要下载支付宝提供的SDK,并将其引入到我们的Android工程中。在引入SDK后,我们可以根据支付宝提供的文档和示例代码进行具体的集成操作。 集成支付宝支付的过程主要包括以下几个步骤: 1. 在AndroidManifest.xml文件中配置支付宝支付所需的权限、服务以及activity。 2. 在应用的代码中,我们需要创建一个支付宝客户端实例,并配置相应的支付参数,如商户ID、订单号、金额等。 3. 调用支付宝客户端实例的支付接口,将支付参数传递给支付宝服务器。 4. 支付宝服务器会返回一个支付结果,我们可以在回调方法中处理这个支付结果,并根据支付结果的状态进行相应的操作,如更新订单状态、跳转到支付成功页面等。 除了以上基本的支付流程外,我们还可以根据需求添加一些附加功能,如查询订单状态、退款等。 在集成支付宝支付时,我们还需要注意一些细节问题。例如,支付宝要求我们的应用必须使用HTTPS协议与其服务器进行通信,因此我们需要确保我们的应用开启了相应的网络权限,并在网络请求时使用HTTPS协议。 另外,为了保证支付安全,我们还需要在支付宝开放平台上生成一个RSA密钥,并将其配置到我们的应用中。 总的来说,集成支付宝支付相对来说并不复杂,只需要按照支付宝的文档和示例代码进行操作,就可以使我们的应用支持支付宝支付功能了。而支付宝支付作为一种简单、安全、方便的支付方式,可以为我们的应用提供更好的用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值