Android app第三方支付宝支付接入教程

支付宝的接入相对比较简单,看看支付宝官网的文档基本都能搞定,但是切记一点让你们的后台也要搞清楚支付宝的流程,重中之重。

1、注意事项
开发前一定要阅读支付宝官方文档
强烈建议签名等处理在后台处理,我这个是测试是在自己本地写的,不要吐槽
想获取支付宝合作商户ID,及支付宝公钥请点击支付宝链接,生成密钥及PKCS8转码工具在文档中
添加Android.permission.INTERNET权限和android.permission.ACCESS_NETWORK_STATE权限
要导入支付宝的包
2、特别注意事项(坑点)
下载支付宝的官网之后生成你所需要的密钥及PKCS8转码一定要小心

代码:
MainActivity中调起支付:Pay pay = new Pay(AffirmOrderActivity.this, paymoney);

Pay 类

public class Pay {

                 /**以下四项这些数值机密填入自己申请的就好**/
  // 商户PID
  public static final String PARTNER = "";
  // 商户收款账号
  public static final String SELLER = "";
  // 商户私钥,pkcs8格式
  public static final String RSA_PRIVATE = "";
  // 支付宝公钥
  public static final String RSA_PUBLIC = "";

  private Activity context;
  private String mgoods,mprice,micon;
  private int mtype;
  private String mOutTradeNo;
  public Pay(Activity activity, String goods,String goodsmore,String price,String icon,int type, String outTradeNo) {
    context = activity;
    mprice = price;
    pay(price);
  }

  private Handler mHandler = new Handler() {

    public void handleMessage(Message msg) {
      switch (msg.what) {
        case SDK_PAY_FLAG: {
          PayResult payResult = new PayResult((String) msg.obj);
          /**
           * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
           * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
           * docType=1) 建议商户依赖异步通知
           */
          String resultInfo = payResult.getResult();// 同步返回需要验证的信息

          String resultStatus = payResult.getResultStatus();
          // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
          if (TextUtils.equals(resultStatus, "9000")) {
            Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show();

          } else {
            // 判断resultStatus 为非"9000"则代表可能支付失败
            // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
            if (TextUtils.equals(resultStatus, "8000")) {
              Toast.makeText(context, "支付结果确认中", Toast.LENGTH_SHORT).show();

            } else {
              // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
              Toast.makeText(context, "支付失败", Toast.LENGTH_SHORT).show();

            }
          }
          break;
        }
        default:
          break;
      }
    };
  };

  /**
   * call alipay sdk pay. 调用SDK支付
   *
   */
  public void pay(String goods,String goodsmore,String price) {
    if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {
      new AlertDialog.Builder(context).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")
          .setPositiveButton("确定", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialoginterface, int i) {
              //
//              finish();
            }
          }).show();
      return;
    }
    String orderInfo = getOrderInfo(goods, goodsmore, price);

    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();
    Log.i("lff", "orderInfo == " +orderInfo);
    Log.i("lff", "sign == " +sign);    Runnable payRunnable = new Runnable() {

      @Override
      public void run() {
        // 构造PayTask 对象
        PayTask alipay = new PayTask(context);
        // 调用支付接口,获取支付结果
        String result = alipay.pay(payInfo, true);

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

    // 必须异步调用
    Thread payThread = new Thread(payRunnable);
    payThread.start();
  }

  /**
   * get the sdk version. 获取SDK版本号
   *
   */
  public void getSDKVersion() {
    PayTask payTask = new PayTask(context);
    String version = payTask.getVersion();
    Toast.makeText(context, version, Toast.LENGTH_SHORT).show();
  }

  /**
   * create the order info. 创建订单信息
   *
   */
  private String getOrderInfo(String subject, String body, String price) {

    // 签约合作者身份ID
    String orderInfo = "partner=" + "\"" + PARTNER + "\"";

    // 签约卖家支付宝账号
    orderInfo += "&seller_id=" + "\"" + SELLER + "\"";

    // 商户网站唯一订单号
    orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";

    // 商品名称
    orderInfo += "&subject=" + "\"" + subject + "\"";

    // 商品详情
    orderInfo += "&body=" + "\"" + body + "\"";

    // 商品金额
    orderInfo += "&total_fee=" + "\"" + "0.01" + "\"";

    // 服务器异步通知页面路径
//    orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\"";
    orderInfo += "&notify_url=" + "\"" + "http://112.74.129.252/new/zfbCallback" + "\"";
    // 服务接口名称, 固定值
    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;
  }

  /**
   * get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
   *
   */
  private String getOutTradeNo() {
//    SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
//    Date date = new Date();
//    String key = format.format(date);
//
//    Random r = new Random();
//    key = key + r.nextInt();
//    key = key.substring(0, 15);
//    return key;
    return mOutTradeNo;
  }

  /**
   * sign the order info. 对订单信息进行签名
   *
   * @param content
   *      待签名订单信息
   */
  private String sign(String content) {
    return SignUtils.sign(content, RSA_PRIVATE);
  }

  /**
   * get the sign type we use. 获取签名方式
   *
   */
  private String getSignType() {
    return "sign_type=\"RSA\"";
  }

}

其它的工具类,原封不动拷贝过去就好

Base64 类

package com.easyhomework.teacher.ui;

public 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);
  }

  /**
   * Encodes hex octects into Base64
   *
   * @param binaryData
   *      Array containing binaryData
   * @return Encoded Base64 array
   */
  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);
  }

  /**
   * Decodes Base64 data into octects
   *
   * @param encoded
   *      string containing Base64 data
   * @return Array containind decoded data.
   */
  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;
  }

  /**
   * remove WhiteSpace from MIME containing encoded Base64 data.
   *
   * @param data
   *      the byte array of base64 data (with WS)
   * @return the new length
   */
  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;
  }
}

总结一下支付宝支付步骤:1、生成秘钥私钥等(一般是后台处理的) ;2、支付宝包复制带项目中 ;3、调用支付(上述MainActivity和pay类) 4、添加工具类

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

(0)

相关推荐

  • Android支付宝支付的示例代码

    上一篇,我们已经详细讲解了Android微信支付,今天接着为大家带来支付宝支付,支付宝支付相对微信支付要简单一些,吐槽一下,而且支付宝文档确实比微信的文档好了不少,下面开始讲解支付流程. 1.首先给出官方文档的地址 Android集成支付宝流程 2.在开始集成和开发前,首先了解一下常用的接入方式和架构建议: 支付流程.png 在开始下一步之前,给大家看看网上的很多操作. 网上的代码.png 这一大堆代码,后面还有,百来行吧,而且支付宝Demo貌似也是这么干的,估计一些新司机就有点懵逼了,至于吗?

  • Android支付宝和微信支付集成

    场景 随着移动支付的兴起,在我们的app'中,会经常有集成支付的需求.这时候一般都会采用微信和支付宝的sdk 来集成 (一)支付宝支付 在使用支付宝支付的过程中,我们是在服务器端生成订单,客户端访问接口,并得到订单信息,调用接口支付,支付成功后支付宝会分别 异步调用服务器端,并向客户端返回支付结果. 开发步骤: ①注册支付宝账号--进行实名认证--提交审核资料--审核通过 支付宝无线快捷支付接口: b.alipay.com/order/productDetail.htm?productId=20

  • Android接入支付宝实现支付功能实例

    我本来是想直接讲Android支付这一块的,包括支付宝,微信,其他第三方整合支付等,但是微信开放平台他对我的账号做了限制,所有我今天就先把重心放在支付宝的支付上,也算是写得尽可能详细些吧,毕竟是第三方的SDK,只要我们耐心的阅读文档和开发引导,这个其实不是很难的,我也是没有用过支付宝的支付,但是我相信,你看完这篇博客,也会对他了如指掌的,好的,我们正文开始 一.准备步骤 1.登录官网 他的官网就是蚂蚁金服的开放平台了,我们可以访问 蚂蚁金服开放平台 ,并且注册账号进行登录 创建应用 如果你是现有

  • Android仿支付宝支付密码输入框

    本文实例为大家分享了Android实现一个仿支付宝支付密码的输入框,主要实现如下: PasswordView.java package com.jackie.alipay.password; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphic

  • Android支付宝支付封装代码

    在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装. 封装的代码也很简单,就是将官网给的demo提取出一个类来方便使用. public class Alipay { // 商户PID public static final String PARTNER = "123456789"; // 商户收款账号 public static final String SELLER = "qibin0506@gmail.co

  • Android支付宝支付设计开发

    在移动支付领域,支付宝支付占用巨大份额,根据艾瑞咨询公布的报告数据:2014Q3,支付宝斩获了82.6%的市场份额,在移动支付的霸主地位越来越稳固.财付通支付的发力点在微信支付和手Q支付,在移动支付格局中取得了10.0%的市场份额,排名第二. 支付宝在移动支付领域的统治地位,使得我们有必要梳理支付宝移动开发流程.本文写作的目的就是梳理支付流程,从架构层面讲述如何在移动应用中嵌入支付宝支付功能,以及指出哪些地方存在开发陷阱. 准备       按照说明,首先需要申请支付宝支付账号.这方面根据网站说

  • Android仿支付宝支付从底部弹窗效果

    我们再用支付宝支付的时候,会从底部弹上来一个对话框,让我们选择支付方式等等,今天我们就来慢慢实现这个功能 效果图 实现 主界面很简单,就是一个按钮,点击后跳到支付详情的Fragment中 package com.example.hfs.alipayuidemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.wi

  • Android app第三方支付宝支付接入教程

    支付宝的接入相对比较简单,看看支付宝官网的文档基本都能搞定,但是切记一点让你们的后台也要搞清楚支付宝的流程,重中之重. 1.注意事项 开发前一定要阅读支付宝官方文档 强烈建议签名等处理在后台处理,我这个是测试是在自己本地写的,不要吐槽 想获取支付宝合作商户ID,及支付宝公钥请点击支付宝链接,生成密钥及PKCS8转码工具在文档中 添加Android.permission.INTERNET权限和android.permission.ACCESS_NETWORK_STATE权限 要导入支付宝的包 2.

  • python实现银联支付和支付宝支付接入

    本文实例为大家分享了python银联支付和支付宝支付接入的具体代码,供大家参考,具体内容如下 前置条件:需要安装Python的OpenSSL模块,我使用的版本是16.1.0,可以使用pip install pyopenssl来安装 一.支付宝支付 1. 使用RSA公钥加密系统进行签名和签名验证,需要自己生成一个RSA私钥和对应的一个RSA公钥(在Linux下可以使用ssh-keygen命令来生成),公钥需要上传至支付宝,供支付宝对开发者发送的请求做签名验证使用:而同时支付宝会提供一个RSA公钥给

  • Android APP开发KML轨迹导出教程示例

    目录 引言 写入kml gps点 奥森10km 轨迹图 引言 前两天在知乎上面找海外骑行.跑步软件Strava的时候,看到一个将运动轨迹从A App 导出,导入到B APP的工具 APP RunGap,恰巧之前给台湾.印度那边的测试同事处理他们的问题时,写过这样的一个工具,KML文件导出,然后在Mac下的 Google 地球上看轨迹是否偏差,是否存在坐标类型的转化错误等问题,能够比较快地定位问题. KML文件,读者有不知道的可以Google一下,它是一种专门存GPS 点数据的xml文件格式. 将

  • PHP实现的支付宝支付功能示例

    本文实例讲述了PHP实现的支付宝支付功能.分享给大家供大家参考,具体如下: 在给app做支付宝支付接口的时候收集内容整理如下: 接口: import('alipay.AopClient', EXTEND_PATH); import('alipay.request.AlipayTradeAppPayRequest', EXTEND_PATH); $aop = new \AopClient(); $aop->gatewayUrl = "https://openapi.alipay.com/ga

  • Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)

    一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商,阿里就是其中之一. 笔者在此总结了下阿里旗下支付宝Android SDK支付的接入流程,供后来者参考. 接入流程如下: 1 签约成为支付宝商户 签约地址:https://b.alipay.com/, 只有成为签约商户的开发者才能具备集成支付宝app支付的资格. 签约资料:1)营业执照 2)APP说明文档 3)商户经营信息.商户联系人等信息 必要时还需提供A

  • Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法(后台订单支付API设计)

    客户端获取后台支付API请求参数的设计 参数样例: { data: { method: 1, platform: 1, version:"1.0", relate_orders:"B201602031023,B2016020310231", order_no: "BZY201604200952100", order_type: 1, total_fee: 1, description: "商品购买", client_ip:'1

  • 如何在Android App中集成支付宝和微信支付功能

    前言 本文主要介绍如何在 Android App 里集成支付宝和微信支付的功能,文中将实现的步骤一步步介绍的非常详细,对同样遇到这个问题的朋友相信会是一个很好的参考,下面话不多说了,来一起看看详细的介绍吧. 集成支付宝支付 没想到现在 App 里集成支付宝是这么的简单,我还折腾了好久- 好了,开始,假设你已经完成了支付宝那些繁杂的申请啥的工作,进入开发了. 首先,去下载官方的 DEMO : App支付客户端DEMO&SDK. 导入开发资源 解压后把里面的 jar 包拿出来放到你工程的 lib 目

  • 如何在Android App中接入微信支付

    本篇简单介绍Android App中接入微信支付,包括App内支付和扫码支付.分享+支付 pofei 微信支付 wechat 官方接入文档 App内支付 源码下载 主要流程: 1.微信支付平台注册账号​ 注:注册并申请成功以后,需要在API安全中设置你的API密钥 32个字符.建议使用 MD5加密 ,并且需要妥善的保存.因为无法查看. 2.生成预支付订单 3.生成签名参数 4.调起微信,完成支付 扫码支付 扫码支付使用的是微信统一下单API ,使用的是模式二,模式一 一直说URL参数错误,完全按

随机推荐