返回顶部
首页 > 资讯 > 移动开发 >Android 支付宝支付功能封装实现
  • 519
分享到

Android 支付宝支付功能封装实现

封装支付宝Android 2022-06-06 12:06:40 519人浏览 泡泡鱼
摘要

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

  在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。封装的代码也很简单,是将官网给的demo提取出一个类来方便使用。      public class Alipay {   // 商户PID   public static final String PARTNER = "123456789";   // 商户收款账号   public static final String SELLER = "qibin0506@gmail.com";   // 商户私钥,pkcs8格式   public static final String RSA_PRIVATE = "rsa_private";   // 支付宝公钥   public static final String RSA_PUBLIC = "rsa_public";   private static final int SDK_PAY_FLAG = 1;   private WeakReference<Activity> Mactivity;   private OnAlipayListener mListener;   public Alipay(Activity activity) {   mActivity = new WeakReference<Activity>(activity);   }   @SuppressLint("HandlerLeak")   private Handler mHandler = new Handler() {   public void handleMessage(Message msg) {   if (msg.what == SDK_PAY_FLAG) {   PayResult payResult = new PayResult((String) msg.obj);   // 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签   String resultInfo = payResult.getResult();   String resultStatus = payResult.getResultStatus();   // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档   if (TextUtils.equals(resultStatus, "9000")) {   if (mListener != null) mListener.onSuccess();   } else {   // 判断resultStatus 为非“9000”则代表可能支付失败   // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,   // 终交易是否成功以服务端异步通知为准(小概率状态)   if (TextUtils.equals(resultStatus, "8000")) {   if (mListener != null) mListener.onWait();   } else {   // 其他值可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误   if (mListener != null) mListener.onCancel();   }   }   }   }   };      public void pay(String title, String desc, String price, String sn, String url) {   // 订单   String orderInfo = getOrderInfo(title, desc, price, sn, url);   // 对订单做RSA 签名   String sign = sign(orderInfo);   try {   // 仅需对sign 做URL编码   sign = URLEncoder.encode(sign, "UTF-8");   } catch (UnsupportedEncodingException e) {   e.printStackTrace();   }   // 完整的符合支付宝参数规范的订单信息   final String payInfo = orderInfo + "&sign=/"" + sign + "/"&"   + getSignType();   Runnable payRunnable = new Runnable() {   @Override   public void run() {   Activity activity = mActivity.get();   if(activity == null) return;   // 构造PayTask 对象   PayTask alipay = new PayTask(activity);   // 调用支付接口,获取支付结果   String result = alipay.pay(payInfo);   Message msg = new Message();   msg.what = SDK_PAY_FLAG;   msg.obj = result;   mHandler.sendMessage(msg);   }   };   // 必须异步调用   Thread payThread = new Thread(payRunnable);   payThread.start();   }      public String getOrderInfo(String subject, String body, String price,   String sn, String url) {   // 签约合作者身份ID   String orderInfo = "partner=" + "/"" + PARTNER + "/"";   // 签约卖家支付宝账号   orderInfo += "&seller_id=" + "/"" + SELLER + "/"";   // 商户网站订单号   orderInfo += "&out_trade_no=" + "/"" + sn + "/"";   // 商品名称   orderInfo += "&subject=" + "/"" + subject + "/"";   // 商品详情   orderInfo += "&body=" + "/"" + body + "/"";   // 商品金额   orderInfo += "&total_fee=" + "/"" + price + "/"";   // 服务器异步通知页面路径   orderInfo += "?ify_url=" + "/"" + url + "/"";   // 服务接口名称, 固定值   orderInfo += "&service=/"mobile.securitypay.pay/"";   // 支付类型, 固定值   orderInfo += "&payment_type=/"1/"";   // 参数编码, 固定值   orderInfo += "&_input_charset=/"utf-8/"";   // 设置未付款交易的超时时间   // 默认30分钟,一旦超时,该笔交易会自动被关闭。   // 取值范围:1m~15d。   // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。   // 该参数数值不接受小数点,如1.5h,可转换为90m。   orderInfo += "&it_b_pay=/"30m/"";   // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付   // orderInfo += "&extern_token=" + "/"" + extern_token + "/"";   // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空   orderInfo += "&return_url=/"m.alipay.com/"";   // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)   // orderInfo += "&paymethod=/"expressGateway/"";   return orderInfo;   }      public String sign(String content) {   return SignUtils.sign(content, RSA_PRIVATE);   }      public String getSignType() {   return "sign_type=/"RSA/"";   }   public void setListener(OnAlipayListener l) {   mListener = l;   }      public static class OnAlipayListener {      public void onSuccess() {}      public void onCancel() {}      public void onWait() {}   }   }   final class Base64 {   private static final int BASELENGTH = 128;   private static final int LOOKUPLENGTH = 64;   private static final int TWENTYFOURBITGROUP = 24;   private static final int EIGHTBIT = 8;   private static final int SIXTEENBIT = 16;   private static final int FOURBYTE = 4;   private static final int SIGN = -128;   private static char PAD = '=';   private static byte[] base64Alphabet = new byte[BASELENGTH];   private static char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];   static {   for (int i = 0; i < BASELENGTH; ++i) {   base64Alphabet[i] = -1;   }   for (int i = 'Z'; i >= 'A'; i--) {   base64Alphabet[i] = (byte) (i - 'A');   }   for (int i = 'z'; i >= 'a'; i--) {   base64Alphabet[i] = (byte) (i - 'a' + 26);   }   for (int i = '9'; i >= '0'; i--) {   base64Alphabet[i] = (byte) (i - '0' + 52);   }   base64Alphabet['+'] = 62;   base64Alphabet['/'] = 63;   for (int i = 0; i <= 25; i++) {   lookUpBase64Alphabet[i] = (char) ('A' + i);   }   for (int i = 26, j = 0; i <= 51; i++, j++) {   lookUpBase64Alphabet[i] = (char) ('a' + j);   }   for (int i = 52, j = 0; i <= 61; i++, j++) {   lookUpBase64Alphabet[i] = (char) ('0' + j);   }   lookUpBase64Alphabet[62] = (char) '+';   lookUpBase64Alphabet[63] = (char) '/';   }   private static boolean isWhiteSpace(char octect) {   return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);   }   private static boolean isPad(char octect) {   return (octect == PAD);   }   private static boolean isData(char octect) {   return (octect < BASELENGTH && base64Alphabet[octect] != -1);   }      public static String encode(byte[] binaryData) {   if (binaryData == null) {   return null;   }   int lengthDataBits = binaryData.length * EIGHTBIT;   if (lengthDataBits == 0) {   return "";   }   int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;   int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;   int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1   : numberTriplets;   char encodedData[] = null;   encodedData = new char[numberQuartet * 4];   byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;   int encodedIndex = 0;   int dataIndex = 0;   for (int i = 0; i < numberTriplets; i++) {   b1 = binaryData[dataIndex++];   b2 = binaryData[dataIndex++];   b3 = binaryData[dataIndex++];   l = (byte) (b2 & 0x0f);   k = (byte) (b1 & 0x03);   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)   : (byte) ((b1) >> 2 ^ 0xc0);   byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4)   : (byte) ((b2) >> 4 ^ 0xf0);   byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6)   : (byte) ((b3) >> 6 ^ 0xfc);   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];   encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];   encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];   }   // fORM integral number of 6-bit groups   if (fewerThan24bits == EIGHTBIT) {   b1 = binaryData[dataIndex];   k = (byte) (b1 & 0x03);   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)   : (byte) ((b1) >> 2 ^ 0xc0);   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];   encodedData[encodedIndex++] = PAD;   encodedData[encodedIndex++] = PAD;   } else if (fewerThan24bits == SIXTEENBIT) {   b1 = binaryData[dataIndex];   b2 = binaryData[dataIndex + 1];   l = (byte) (b2 & 0x0f);   k = (byte) (b1 & 0x03);   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)   : (byte) ((b1) >> 2 ^ 0xc0);   byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4)   : (byte) ((b2) >> 4 ^ 0xf0);   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];   encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];   encodedData[encodedIndex++] = PAD;   }   return new String(encodedData);   }      public static byte[] decode(String encoded) {   if (encoded == null) {   return null;   }   char[] base64Data = encoded.toCharArray();   // remove white spaces   int len = removeWhiteSpace(base64Data);   if (len % FOURBYTE != 0) {   return null;// should be divisible by four   }   int numberQuadruple = (len / FOURBYTE);   if (numberQuadruple == 0) {   return new byte[0];   }   byte decodedData[] = null;   byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;   char d1 = 0, d2 = 0, d3 = 0, d4 = 0;   int i = 0;   int encodedIndex = 0;   int dataIndex = 0;   decodedData = new byte[(numberQuadruple) * 3];   for (; i < numberQuadruple - 1; i++) {   if (!isData((d1 = base64Data[dataIndex++]))   || !isData((d2 = base64Data[dataIndex++]))   || !isData((d3 = base64Data[dataIndex++]))   || !isData((d4 = base64Data[dataIndex++]))) {   return null;   }// if found "no data" just return null   b1 = base64Alphabet[d1];   b2 = base64Alphabet[d2];   b3 = base64Alphabet[d3];   b4 = base64Alphabet[d4];   decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);   decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));   decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);   }   if (!isData((d1 = base64Data[dataIndex++]))   || !isData((d2 = base64Data[dataIndex++]))) {   return null;// if found "no data" just return null   }   b1 = base64Alphabet[d1];   b2 = base64Alphabet[d2];   d3 = base64Data[dataIndex++];   d4 = base64Data[dataIndex++];   if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters   if (isPad(d3) && isPad(d4)) {   if ((b2 & 0xf) != 0)// last 4 bits should be zero   {   return null;   }   byte[] tmp = new byte[i * 3 + 1];   System.arraycopy(decodedData, 0, tmp, 0, i * 3);   tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);   return tmp;   } else if (!isPad(d3) && isPad(d4)) {   b3 = base64Alphabet[d3];   if ((b3 & 0x3) != 0)// last 2 bits should be zero   {   return null;   }   byte[] tmp = new byte[i * 3 + 2];   System.arraycopy(decodedData, 0, tmp, 0, i * 3);   tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);   tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));   return tmp;   } else {   return null;   }   } else { // No PAD e.g 3cQl   b3 = base64Alphabet[d3];   b4 = base64Alphabet[d4];   decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);   decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));   decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);   }   return decodedData;   }      private static int removeWhiteSpace(char[] data) {   if (data == null) {   return 0;   }   // count characters that's not whitespace   int newSize = 0;   int len = data.length;   for (int i = 0; i < len; i++) {   if (!isWhiteSpace(data[i])) {   data[newSize++] = data[i];   }   }   return newSize;   }   }   class PayResult {   private String resultStatus;   private String result;   private String memo;   public PayResult(String rawResult) {   if (TextUtils.isEmpty(rawResult))   return;   String[] resultParams = rawResult.split(";");   for (String resultParam : resultParams) {   if (resultParam.startsWith("resultStatus")) {   resultStatus = gatValue(resultParam, "resultStatus");   }   if (resultParam.startsWith("result")) {   result = gatValue(resultParam, "result");   }   if (resultParam.startsWith("memo")) {   memo = gatValue(resultParam, "memo");   }   }   }   @Override   public String toString() {   return "resultStatus={" + resultStatus + "};memo={" + memo   + "};result={" + result + "}";   }   private String gatValue(String content, String key) {   String prefix = key + "={";   return content.substring(content.indexOf(prefix) + prefix.length(),   content.lastIndexOf("}"));   }      public String getResultStatus() {   return resultStatus;   }      public String getMemo() {   return memo;   }      public String getResult() {   return result;   }   }   class SignUtils {   private static final String ALGoRITHM = "RSA";   private static final String SIGN_ALGORITHMS = "SHA1WithRSA";   private static final String DEFAULT_CHARSET = "UTF-8";   public static String sign(String content, String privateKey) {   try {   PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(   Base64.decode(privateKey));   KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);   PrivateKey priKey = keyf.generatePrivate(priPKCS8);   java.security.Signature signature = java.security.Signature   .getInstance(SIGN_ALGORITHMS);   signature.initSign(priKey);   signature.update(content.getBytes(DEFAULT_CHARSET));   byte[] signed = signature.sign();   return Base64.encode(signed);   } catch (Exception e) {   e.printStackTrace();   }   return null;   }   }   前面的几个常量是需要去支付宝官网获取的,获取后直接替换ok,其他的代码基本都是从demo中copy出来的, 现在我们将支付功能封装到了一个类中,那么如何使用呢?   Alipay alipay = new Alipay(OrderConfirmActivity.this);   alipay.setListener(mAlipayListener);   alipay.pay(desc, mOrder.getShopName(), String.valueOf(orderAmount), orderSn, url);      private Alipay.OnAlipayListener mAlipayListener = new Alipay.OnAlipayListener() {   @Override   public void onSuccess() {   onOrderSubmitSuccess();   }   @Override   public void onCancel() {   onUserOrderCanceled();   Toast.makeText(OrderConfirmActivity.this, R.string.pay_failed,   Toast.LENGTH_SHORT).show();   }   @Override   public void onWait() {   }   };   new出对象来,只需要调用pay方法ok啦, 不过支付的回调我们还是必须的,当然这个也不麻烦。这里说一下pay方法的几个参数,   title 支付的标题   desc 支付的描述   price 支付的金额   sn 商品的货号   url 服务器的回调url   这几个参数在做支付的时候服务器都会给到,但是要注意一下,这几个参数都不能为空或者空字符串,否则会支付失败。


--结束END--

本文标题: Android 支付宝支付功能封装实现

本文链接: https://lsjlt.com/news/28591.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android 支付宝支付功能封装实现
      在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。封装的代码也很简单,是将官网给的demo提取出一个...
    99+
    2022-06-06
    封装 支付宝 Android
  • Android支付宝支付封装代码
    在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。 封装的代码也很简单,就是将官网给的demo提取出一个类...
    99+
    2022-06-06
    封装 Android
  • Vue如何实现支付宝支付功能
    这篇文章主要介绍了Vue如何实现支付宝支付功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先给大家上个效果图: <div&...
    99+
    2024-04-02
  • Android中怎么接入支付宝实现支付功能
    本篇文章为大家展示了Android中怎么接入支付宝实现支付功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.登录官网他的官网就是蚂蚁金服的开放平台了,我们可以访问 蚂蚁金服开放平台 ,并且注册账...
    99+
    2023-05-31
    android
  • Android集成支付宝支付功能示例
    公司项目中需要支付功能,现在支付宝、微信支付很方便,也很多人使用,因此,他们是首选。在此记录一下支付宝集成过程,下期为微信支付,敬请期待首先去支付宝官网下载其最新的Android的SDK集成Dmeo支付宝 选择SDK&Dmeo进行下...
    99+
    2023-05-30
    android 支付宝 支付
  • vue项目中的支付功能实现(微信支付和支付宝支付)
    目录项目中常见的支付方式    支付宝支付微信支付项目中常见的支付方式     支付宝支付  &nbs...
    99+
    2024-04-02
  • uniapp如何实现支付宝支付的功能
    随着移动互联网的飞速发展,人们越来越依赖于手机支付。而支付宝是其中使用最广泛的支付方式之一。在移动应用中,如果要进行支付宝支付的功能开发,那么使用uniapp框架就是一个非常好的选择。本文将介绍uniapp如何实现支付宝支付的功能。一、准备...
    99+
    2023-05-14
  • iOS实现H5支付(微信、支付宝)原生封装
    前言 支付分APP支付、H5支付、扫码支付等。app支付一般在app中使用,并且需要集成相应的支付SDK,H5支付多用于网页。如果你的APP不想集成支付SDK,又想实现支付功能,你...
    99+
    2022-06-05
    iOS H5支付 微信 支付宝
  • Springboot整合支付宝支付功能
    1.需要的Maven依赖 // 支付宝 <dependency> <groupId>com.alipay.sdk</groupId> ...
    99+
    2024-04-02
  • UniApp + SpringBoot 实现支付宝支付和退款功能
    目录开发准备支付宝支付开发后端部分前端部分支付宝退款开发后端部分上篇介绍了UniApp + SpringBoot 实现微信支付和退款功能,喜欢的朋友可以点击查看。 开发准备 一台用于...
    99+
    2024-04-02
  • SpringBoot实现简易支付宝网页支付功能
           该文章描述了一个基于SpringBoot程序的支付宝支付demo,由于是个人开发者而非企业,因此设...
    99+
    2024-04-02
  • Android支付宝支付开发实例
    在移动应用满天飞的时代,随着移动支付的盛行,很多应用中都集成了支付功能。之前的支付一直不是我负责,近期这个项目我负责订单模块少不了要做支付,每每提起支付就觉得怕怕,觉得很难,但...
    99+
    2022-06-06
    Android
  • 如何进行vue项目中的支付功能实现(微信支付和支付宝支付)
    如何进行vue项目中的支付功能实现(微信支付和支付宝支付),针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。项目中常见的支付方式    支付宝支付...
    99+
    2023-06-22
  • Android实现支付宝手势密码功能
    今天就给大家分享android实现支付宝手势密码,很常见,像现在用微信支付,支付宝支付的时候都要自己设置的4位PIN码,然后输入PIN码后立即调用支付接口去支付,毫无疑问的安全...
    99+
    2022-06-06
    支付宝 手势 Android
  • Android仿支付宝微信支付密码界面弹窗封装dialog
    一,功能效果 二,实现过程 1,先写xml文件:dialog_keyboard.xml     注意事项 (1),密码部分用的是一个线性布局中6...
    99+
    2022-06-06
    弹窗 界面 dialog 微信支付 支付宝 Android
  • Android实现支付宝支付密码输入界面
    本文实例为大家分享了Android实现支付宝支付密码输入界面的具体代码,供大家参考,具体内容如下 效果图: 主要代码: import java.util.ArrayList;   ...
    99+
    2024-04-02
  • 怎么用Java也实现微信和支付宝支付功能
    这篇文章主要介绍“怎么用Java也实现微信和支付宝支付功能”,在日常操作中,相信很多人在怎么用Java也实现微信和支付宝支付功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Android支付宝支付设计开发
         在移动支付领域,支付宝支付占用巨大份额,根据艾瑞咨询公布的报告数据:2014Q3,支付宝斩获了82.6%的市场份额,在移动支付...
    99+
    2022-06-06
    Android
  • 怎么用php实现支付宝支付
    本文操作环境:Windows7系统、PHP7.4版、DELL G3电脑怎么用php实现支付宝支付?PHP实现支付宝支付:提示:这里的demo使用的时沙箱支付 需要先注册沙箱账号等注册沙箱账号:首先扫码登录支付宝开放平台注册 地址:https...
    99+
    2021-05-21
    PHP 支付宝支付
  • 如何用php实现支付宝支付
    这篇文章主要讲解了“如何用php实现支付宝支付”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用php实现支付宝支付”吧!用php实现支付宝支付的方法:1、扫码登录支付宝开放平台注册;2、...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作