Android接入微信支付的方法

1、先在微信开放平台申请开发应用,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。

2、注册APPID (这个可以放在项目的application里)

商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:

final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");

3、调用统一下单api生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。
例:

下面代码中的订单号是需要后台生成的

        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        WXPrePost post = new WXPrePost();
        post.appid = "你的appId";
        post.mch_id = "你的商户号";
        post.nonce_str = StringUtils.genNonceStr();//随机字符串 **1
        post.body = "商品名称";
        post.detail = "商品的描述";
        post.out_trade_no = out_trade_no; //商户订单号 **2
        post.total_fee = "商品价格";//单位是分
        post.spbill_create_ip = getLocalIpAddress();//ip地址 **3
        post.notify_url = "";//这里是后台接受支付结果通知的url地址
        post.trade_type = "APP";
        post.sign = genPackageSign(post);//签名 **4

        List<NameValuePair> firstSignParams = getFirstSignParams(post);
        String xml = toXml(firstSignParams);
        String entity = null;
        try {
          entity = new String(xml.getBytes(), "ISO8859-1");
          byte[] buf = Util.httpPost(url, entity);
          if (buf != null) {
            String content = new String(buf);
            Map<String, String> map = decodeXml(content);

            if (map != null) {
              //再次签名(参与签名的字段有 :Appid partnerId prepayId nonceStr TimeStamp package)
              String appId = "";
              String prepayId = "";
              String nonceStr = "";
              for (Map.Entry<String, String> entry : map.entrySet()) {
                if ("appid".equals(entry.getKey())) {
                  appId = entry.getValue();
                } else if ("prepay_id".equals(entry.getKey())) {
                  prepayId = entry.getValue();
                } else if ("nonce_str".equals(entry.getKey())) {
                  nonceStr = entry.getValue();
                }
              }
              Log.d(TAG, "run: :" + appId + "/" + prepayId + "/" + nonceStr + "/");
              String TimeStamp = String.valueOf(genTimeStamp());

              //ok 获取二次签名
              String secondPackageSign = genSecondPackageSign(getSecondSignParams(appId, prepayId, nonceStr, TimeStamp));
              PayReq req = new PayReq();
              req.appId = appId;
              req.partnerId = "商户号";
              req.prepayId = prepayId;
              req.nonceStr = nonceStr;
              req.timeStamp = TimeStamp;
              req.packageValue = "Sign=WXPay";
              req.sign = secondPackageSign;
              req.extData = "app data"; // optional
              //      System.out.println("genPackageSign3:"+post.getSign()+"/"+secondPackageSign);
              // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
              mApi.sendReq(req);
              Log.d(TAG, "run: " + appId + "/" + prepayId + "/" + nonceStr + "/" + TimeStamp + "/" + secondPackageSign);
            }
          }
        } catch (Exception e) {

        }
public static byte[] httpPost(String url, String entity) {
    if (url == null || url.length() == 0) {
      Log.e(TAG, "httpPost, url is null");
      return null;
    }

    HttpClient httpClient = getNewHttpClient();

    HttpPost httpPost = new HttpPost(url);

    try {
      httpPost.setEntity(new StringEntity(entity));
      httpPost.setHeader("Accept", "application/json");
      httpPost.setHeader("Content-type", "application/json");

      HttpResponse resp = httpClient.execute(httpPost);
      if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
        Log.e(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode());
        return null;
      }

      return EntityUtils.toByteArray(resp.getEntity());
    } catch (Exception e) {
      Log.e(TAG, "httpPost exception, e = " + e.getMessage());
      e.printStackTrace();
      return null;
    }
  }
   //获取随机字符串的方法
  public static String genNonceStr() {
    Random random = new Random();
    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
  }
 private String toXml(List<NameValuePair> params) {
    StringBuilder sb = new StringBuilder();
    sb.append("<xml>");
    for (int i = 0; i < params.size(); i++) {
      sb.append("<" + params.get(i).getName() + ">");
      sb.append(params.get(i).getValue());
      sb.append("</" + params.get(i).getName() + ">");
    }
    sb.append("</xml>");
    return sb.toString();
  }
 public Map<String, String> decodeXml(String content) {
    try {
      Map<String, String> xml = new HashMap<>();
      XmlPullParser parser = Xml.newPullParser();
      parser.setInput(new StringReader(content));
      int event = parser.getEventType();
      while (event != XmlPullParser.END_DOCUMENT) {
        String nodeName = parser.getName();
        switch (event) {
          case XmlPullParser.START_DOCUMENT:
            break;
          case XmlPullParser.START_TAG:
            if (!"xml".equals(nodeName)) {
              xml.put(nodeName, parser.nextText());
            }
            break;
          case XmlPullParser.END_TAG:
            break;
        }
        event = parser.next();
      }
      return xml;
    } catch (Exception e) {
    }
    return null;
  }
 @NonNull
  private List<NameValuePair> getFirstSignParams(WXPrePost params) {
    List<NameValuePair> packageParams = new LinkedList<>();
    packageParams.add(new BasicNameValuePair("appid", "appId"));
    packageParams.add(new BasicNameValuePair("body", params.body));
    packageParams.add(new BasicNameValuePair("detail", params.detail));
    packageParams.add(new BasicNameValuePair("mch_id", "商户号"));
    packageParams.add(new BasicNameValuePair("nonce_str", params.nonce_str));
    packageParams.add(new BasicNameValuePair("notify_url", params.notify_url));
    packageParams.add(new BasicNameValuePair("out_trade_no", params.out_trade_no));
    packageParams.add(new BasicNameValuePair("spbill_create_ip", params.spbill_create_ip));
    packageParams.add(new BasicNameValuePair("total_fee", params.total_fee + ""));
    packageParams.add(new BasicNameValuePair("trade_type", params.trade_type));
    packageParams.add(new BasicNameValuePair("sign", params.sign));
    return packageParams;
  }
public class WXPrePost {

  //必须带的参数
  public String appid;
  //微信开放平台审核通过的应用APPID

  public String mch_id;
  //微信支付分配的商户号

  public String nonce_str;
  //随机字符串,不长于32位。推荐随机数生成算法

  public String sign;
  //签名,详见签名生成算法

  public String body;
  // 商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。

  public String out_trade_no;
  // 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号

  public int total_fee;
  // 订单总金额,单位为分,详见支付金额

  public String spbill_create_ip;
  // 用户端实际ip

  public String notify_url;
  // 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。(后台提供的)

  public String trade_type;
  // 支付类型

  // 非必须携带的参数

  public String device_info;
  // 终端设备号(门店号或收银设备ID),默认请传"WEB"

  public String detail;
  // 商品名称明细列表

  public String attach;
  // 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据

  public String fee_type;
  // 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
  //
  public String time_start;
  // 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
  //
  public String time_expire;
  // 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则 注意:最短失效时间间隔必须大于5分钟
  public String goods_tag;
  // 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
  //
  public String limit_pay;
  //no_credit--指定不能使用信用卡支付

  public String getAppid() {
    return appid;
  }

  public void setAppid(String appid) {
    this.appid = appid;
  }

  public String getMch_id() {
    return mch_id;
  }

  public void setMch_id(String mch_id) {
    this.mch_id = mch_id;
  }

  public String getNonce_str() {
    return nonce_str;
  }

  public void setNonce_str(String nonce_str) {
    this.nonce_str = nonce_str;
  }

  public String getSign() {
    return sign;
  }

  public void setSign(String sign) {
    this.sign = sign;
  }

  public String getBody() {
    return body;
  }

  public void setBody(String body) {
    this.body = body;
  }

  public String getOut_trade_no() {
    return out_trade_no;
  }

  public void setOut_trade_no(String out_trade_no) {
    this.out_trade_no = out_trade_no;
  }

  public int getTotal_fee() {
    return total_fee;
  }

  public void setTotal_fee(int total_fee) {
    this.total_fee = total_fee;
  }

  public String getSpbill_create_ip() {
    return spbill_create_ip;
  }

  public void setSpbill_create_ip(String spbill_create_ip) {
    this.spbill_create_ip = spbill_create_ip;
  }

  public String getNotify_url() {
    return notify_url;
  }

  public void setNotify_url(String notify_url) {
    this.notify_url = notify_url;
  }

  public String getTrade_type() {
    return trade_type;
  }

  public void setTrade_type(String trade_type) {
    this.trade_type = trade_type;
  }

  public String getDevice_info() {
    return device_info;
  }

  public void setDevice_info(String device_info) {
    this.device_info = device_info;
  }

  public String getDetail() {
    return detail;
  }

  public void setDetail(String detail) {
    this.detail = detail;
  }

  public String getAttach() {
    return attach;
  }

  public void setAttach(String attach) {
    this.attach = attach;
  }

  public String getFee_type() {
    return fee_type;
  }

  public void setFee_type(String fee_type) {
    this.fee_type = fee_type;
  }

  public String getTime_start() {
    return time_start;
  }

  public void setTime_start(String time_start) {
    this.time_start = time_start;
  }

  public String getTime_expire() {
    return time_expire;
  }

  public void setTime_expire(String time_expire) {
    this.time_expire = time_expire;
  }

  public String getGoods_tag() {
    return goods_tag;
  }

  public void setGoods_tag(String goods_tag) {
    this.goods_tag = goods_tag;
  }

  public String getLimit_pay() {
    return limit_pay;
  }

  public void setLimit_pay(String limit_pay) {
    this.limit_pay = limit_pay;
  }
}

这里给出的参数都是可以移动端自己获取到的,当然,最好是后台提供给我们,出于安全性考虑

支付完成,微信会回调WXPayEntryActivity,这里就不详细说了,微信文档说的很清晰
在WXPayEntryActivity的onResp()里面返回的微信支付的结果(注:这个结果不能作为我们购买商品成功与否的结果,要以微信回调给回台,然后回台告诉我们的支付结果为准)

if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

      int code = resp.errCode;
      switch (code) {
        case 0:
          Log.d(TAG, "onPayFinish, errCode = " + "支付成功");
          //微信支付成功后去调后台,以后台返回的支付结果为准
          //这里是微信支付完成后的回调,在这里请求后台,让他来告诉我们到底支付成功没。
          break;
        case -1:
          Toast.makeText(this, "支付失败1", Toast.LENGTH_SHORT).show();
          Log.d(TAG, "onPayFinish, errCode = " + "支付失败1");
          finish();
          break;
        case -2:
          Toast.makeText(this, "支付取消", Toast.LENGTH_SHORT).show();
          Log.d(TAG, "onPayFinish, errCode = " + "支付取消");
          finish();
          break;
        default:
//          Toast.makeText(this, "支付失败2", Toast.LENGTH_SHORT).show();
          Log.d(TAG, "onPayFinish, errCode = " + "支付失败2");
          setResult(RESULT_OK);
          finish();
          break;
      }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android端微信支付V3版本地签名统一下单详解

    满满的都是坑,因为服务器偷懒让客服端写统一下单,服务器只给了通知的url.微信的支付demo并没有统一下单的代码. 读此文前先阅读: https://pay.weixin.qq.com/wiki/doc/api/app/app.PHP?chapter=9_1 一步步的来  先根据统一下单的参数介绍工具: 1. 获取到当前的ip: <span style="font-size:14px;">public String getLocalIpAddress() { try { f

  • 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—基于微信开放平台v3SDK开发(微信支付填坑)

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束...进入正题 开发准备: 1.在微信开放平台申请账号 2.成功后创建应用,就是填一些看似很官方很正经的资料了...(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的) 3.微信支付是需要额外

  • android微信支付源码分享

    本文为大家分享了android微信支付源码,供大家参考,具体内容如下 参数配置 public static final String APP_ID ; /** 在微信开放平台注册app,微信给分配的id **/ public static final String MCH_ID; /** 申请开通微信支付,成功后微信会给你发一封邮件,给你分配一个商户平台账号,在资料里有商户ID **/ public static final String API_KEY; /** 在微信发给你的那封邮件里,给你

  • Android微信支付获取二次签名Sign的方法

    本文实例为大家分享了Android微信支付获取二次签名Sign的方法,供大家参考,具体内容如下 /** * 获取sign签名 * * @return */ private String genPayReq() { // 获取参数的值 PayReq request = new PayReq(); request.appId = ConstantsMember.APP_ID; request.partnerId = ConstantsMember.MCHID; request.prepayId =

  • Android App支付系列(一):微信支付接入详细指南(附官方支付demo)

    写在前面 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一.梳理了下微信支付的接入,今天给大家分享下腾讯旗下的微信支付SDK的接入流程. 接入流程 1.申请开发者资质 地址:https://open.weixin.qq.com/ 使用公司管理者/高层帐号登录微信开放平台,进入"账号中心",进行开发者资质认证,需要填写公司资料,包括但不限于,公司注册号,公司营业执照,公司对外办公电话,公司对公银行卡

  • Android高仿微信支付密码输入控件

    像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现这个功能. 老样子,投篮需要找准角度,变成需要理清思路.对于这个"小而美"的控件,我们思路应该这样子. Ⅰ.将要输入密码数量动态通过代码加载出来. Ⅱ.利用Gridview模拟产生一个输入数字键盘,并且按照习惯从屏幕底部弹出来. Ⅲ.对输入数字键盘进行事件监听,将这个输入数字填入到这个密码框中,并且当您输入密码长度一致的时候,进行事件回调. 这个思维导图应该是这样的: 首先,我们要根据需求动态加

  • Android开发微信APP支付功能的要点小结

    基本概念 包名值得是你APP的包,在创建工程时候设置的,需要在微信支付平台上面设置. 签名指的是你生成APK时候所用的签名文件的md5,去掉:全部小写,需要在微信支付平台上面设置. 调试阶段,签名文件可以使用调试用的debug.keystore,签名可以直接在eclipse上面查看,或者用工具查看 ,安装打开输入包名即可查看. 发布的时候一定需要在微信支付平台上面设置成发布用的签名值. 官方的Demo里面的内容并不是全是必须的,甚至只需要有libammsdk.jar就够了,AndroidMani

  • Android集成微信支付功能

    准备工作这里就不说了,包括签约和申请APPID,附上微信开放平台APP开发步骤,不懂的同学可以参考这里: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 上面的步骤很详细,这里主要说下调起支付的注意事项.按照上面文档中说的商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付. 相关代码如下: /** * 商户服务器生成支付订单,先调用统一下单API(详见第

  • Android接入微信支付的方法

    1.先在微信开放平台申请开发应用,微信开放平台会生成APP的唯一标识APPID.由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付. 2.注册APPID (这个可以放在项目的application里) 商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下: final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null); // 将该app注册到微信 msgApi.

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

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

  • Android实现微信支付功能详解

    1.集成微信支付SDK: 在build.gradle中,添加如下依赖 compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' 2.设置微信支付回调页面: 路径:项目包名.wxapi 名称:WXPayEntryActivity public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; @

  • IOS客户端接入微信支付

    实际上,从代码的角度,调起支付APP就是把一些关键的参数通过一定方式打包成为一个订单,然后发送到支付平台的服务器.所以,只要搞清楚了参数设置,搞清楚了每个支付平台的SDK里面一些关键API的使用,基本上就可以很简单的支持支付. 今天记录一下客户端里面,如何支持微信支付.首先.我们要仔细阅读一下微信SDK的开发文档,了解一下整个支付的大概流程. 然后根据提示,把相应的SDK下载下来,所谓的SDK,也就是一个链接库和两个头文件,很简单. 下载完毕,需要把SDK导入到工程里面,并且配置一下工程.因为开

  • Android实现微信支付功能

    开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要获得微信支付接口权限,然后获取对应的商户号.API密钥,这两者缺一不可,并且在APP微信支付中使用 获得商户号.API密钥 在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台:http://pay.weixin.qq.com 查看对应的商户号.API密钥 >申请微信支付接口 >登录商户平

  • Android仿微信支付密码弹出层功能

    预览 使用 这个弹出层是一个DialogFragment,逻辑都封装在其内部,使用起来很简单: Bundle bundle = new Bundle(); bundle.putString(PayFragment.EXTRA_CONTENT, "提现:¥ " + 100.00); PayFragment fragment = new PayFragment(); fragment.setArguments(bundle); fragment.setPaySuccessCallBack(

  • Android实现微信支付的统一下单

    本文实例为大家分享了Android实现微信支付统一下单的具体代码,供大家参考,具体内容如下 准备工作 申请微信开发者账号,添加应用及申请开通微信支付功能,如 查看开通流程 统一下单的接口文档: 查看接口 开发 ①下载sdk: sdk和demo下载 ②可以导入包 在build.gradle文件中,添加如下依赖即可: dependencies { compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' } 或 dependenci

  • SpringBoot接入支付宝支付的方法步骤

    支付宝今年推出了新的转账接口alipay.fund.trans.uni.transfer(升级后安全性更高,功能更加强大) ,老转账接口alipay.fund.trans.toaccount.transfer将不再维护,新老接口的一个区别就是新接口采用的证书验签方式.使用新接口要将sdk版本升级到最新版本,博主升级时最新版本是4.10.97.接下来看集成步骤 1.将支付宝开放平台里下载的3个证书放在resources下面 2.写支付宝支付的配置文件 alipay.properties alipa

  • Android接入支付宝和微信支付的方法

    前言 很多APP都需要支付功能,国内一般就是支付宝和微信了.目前这2种接入方式对于APP端来说都已经比较方便了,因为大部分的安全校验之类的逻辑都在服务端. APP端总结起来就是三步走: 接入支付的库 接受服务端的订单信息,发起调用支付宝和微信 接收支付宝和微信的回调 支付宝接入 首先是接入支付宝的aar文件 比较坑的是支付宝还需要下载aar文件导入,而不是gradle里面一行依赖就能搞定的. 我们需要去官网下载最新的DEMO和SDK,官网地址在这里 然后把下载下来的aar包,放到项目目录下面的

  • Android第三方微信支付教程

    做了微信支付,下载了Demo,发现和之前有所改动,v3.0的版本,也许有的朋友还在摸索,这里我已经成功支付,话不多说,直接进入主题: 一.首先要在微信开发平台注册账号,新增应用,填写正确的包名,正确的签名(MD5中的一串字符冒号去掉,全部小写),当然也会生成的AppID和AppSecret都有用!最后还要花300大洋开通支付功能! 二.分析一下微信支付的流程 三.界面交互流程 上面都看明白了,接下来就是写代码了 四.这里必须要有wxapi这个包名,同时必须有WXPayEntryActivity这

随机推荐