Android支付宝接口集成

MobileSecurePayer之外的内容全部整合到MobileSecurePayerHelper之中。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 /* * 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负责处理支付过程中的相应事件:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 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://www.android-study.com/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( "¬ify_url=\"%s\"" , "http://www.android-study.com/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. android日历实现
  2. flutter技术栈!字节跳动Android研发岗这些知识点内部泄露出来了,年
  3. Android(安卓)面试题总结之Android(安卓)基础(一)
  4. 移动互联网的新宠:Android之缤纷世界
  5. 移动互联网的新宠:Android之缤纷世界
  6. 移动互联网的新宠:Android之缤纷世界
  7. 移动互联网的新宠:Android之缤纷世界
  8. 移动互联网的新宠:Android之缤纷世界
  9. Android的之我见

随机推荐

  1. 慢学Android(安卓)Jetpack
  2. Android获取View的宽度和高度
  3. Android(安卓)关于引用jackson的jar包混
  4. 转-Lottie开源动画库介绍与使用示例
  5. C#实现Android自动打包工具
  6. [置顶] VirtualAPK:滴滴 Android(安卓)插
  7. android sdk升级后卡在Installing apk问
  8. Android(安卓)字体修改,所有的细节都在这
  9. Android(安卓)WallpaperManager浅析
  10. Android中关于画布Skew,斜切操作的计算方