最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android接入微信支付的方法

 更新時間:2018年05月28日 10:01:58   作者:大校啊  
這篇文章主要介紹了Android接入微信支付的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1、先在微信開放平臺申請開發(fā)應(yīng)用,微信開放平臺會生成APP的唯一標(biāo)識APPID。由于需要保證支付安全,需要在開放平臺綁定商戶應(yīng)用包名和應(yīng)用簽名,設(shè)置好后才能正常發(fā)起支付。

2、注冊APPID (這個可以放在項(xiàng)目的application里)

商戶APP工程中引入微信JAR包,調(diào)用API前,需要先向微信注冊您的APPID,代碼如下:

final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 將該app注冊到微信
msgApi.registerApp("wxd930ea5d5a258f4f");

3、調(diào)用統(tǒng)一下單api生成預(yù)付單,獲取到prepay_id后將參數(shù)再次簽名傳輸給APP發(fā)起支付。
例:

下面代碼中的訂單號是需要后臺生成的

        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();//隨機(jī)字符串 **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 = "";//這里是后臺接受支付結(jié)果通知的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);
              // 在支付之前,如果應(yīng)用沒有注冊到微信,應(yīng)該先調(diào)用IWXMsg.registerApp將應(yīng)用注冊到微信
              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;
    }
  }
   //獲取隨機(jī)字符串的方法
  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 {

  //必須帶的參數(shù)
  public String appid;
  //微信開放平臺審核通過的應(yīng)用APPID

  public String mch_id;
  //微信支付分配的商戶號

  public String nonce_str;
  //隨機(jī)字符串,不長于32位。推薦隨機(jī)數(shù)生成算法

  public String sign;
  //簽名,詳見簽名生成算法

  public String body;
  // 商品描述交易字段格式根據(jù)不同的應(yīng)用場景按照以下格式:APP——需傳入應(yīng)用市場上的APP名字-實(shí)際商品名稱,天天愛消除-游戲充值。

  public String out_trade_no;
  // 商戶系統(tǒng)內(nèi)部的訂單號,32個字符內(nèi)、可包含字母, 其他說明見商戶訂單號

  public int total_fee;
  // 訂單總金額,單位為分,詳見支付金額

  public String spbill_create_ip;
  // 用戶端實(shí)際ip

  public String notify_url;
  // 接收微信支付異步通知回調(diào)地址,通知url必須為直接可訪問的url,不能攜帶參數(shù)。(后臺提供的)

  public String trade_type;
  // 支付類型

  // 非必須攜帶的參數(shù)

  public String device_info;
  // 終端設(shè)備號(門店號或收銀設(shè)備ID),默認(rèn)請傳"WEB"

  public String detail;
  // 商品名稱明細(xì)列表

  public String attach;
  // 附加數(shù)據(jù),在查詢API和支付通知中原樣返回,該字段主要用于商戶攜帶訂單的自定義數(shù)據(jù)

  public String fee_type;
  // 符合ISO 4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY,其他值列表詳見貨幣類型
  //
  public String time_start;
  // 訂單生成時間,格式為yyyyMMddHHmmss,如2009年12月25日9點(diǎn)10分10秒表示為20091225091010。其他詳見時間規(guī)則
  //
  public String time_expire;
  // 訂單失效時間,格式為yyyyMMddHHmmss,如2009年12月27日9點(diǎn)10分10秒表示為20091227091010。其他詳見時間規(guī)則 注意:最短失效時間間隔必須大于5分鐘
  public String goods_tag;
  // 商品標(biāo)記,代金券或立減優(yōu)惠功能的參數(shù),說明詳見代金券或立減優(yōu)惠
  //
  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;
  }
}

這里給出的參數(shù)都是可以移動端自己獲取到的,當(dāng)然,最好是后臺提供給我們,出于安全性考慮

支付完成,微信會回調(diào)WXPayEntryActivity,這里就不詳細(xì)說了,微信文檔說的很清晰
在WXPayEntryActivity的onResp()里面返回的微信支付的結(jié)果(注:這個結(jié)果不能作為我們購買商品成功與否的結(jié)果,要以微信回調(diào)給回臺,然后回臺告訴我們的支付結(jié)果為準(zhǔn))

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

      int code = resp.errCode;
      switch (code) {
        case 0:
          Log.d(TAG, "onPayFinish, errCode = " + "支付成功");
          //微信支付成功后去調(diào)后臺,以后臺返回的支付結(jié)果為準(zhǔn)
          //這里是微信支付完成后的回調(diào),在這里請求后臺,讓他來告訴我們到底支付成功沒。
          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;
      }
    }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)單鏈表SingleLinkedList增刪改查及反轉(zhuǎn) 逆序等

    Java實(shí)現(xiàn)單鏈表SingleLinkedList增刪改查及反轉(zhuǎn) 逆序等

    單鏈表是鏈表的其中一種基本結(jié)構(gòu)。一個最簡單的結(jié)點(diǎn)結(jié)構(gòu)如圖所示,它是構(gòu)成單鏈表的基本結(jié)點(diǎn)結(jié)構(gòu)。在結(jié)點(diǎn)中數(shù)據(jù)域用來存儲數(shù)據(jù)元素,指針域用于指向下一個具有相同結(jié)構(gòu)的結(jié)點(diǎn)。 因?yàn)橹挥幸粋€指針結(jié)點(diǎn),稱為單鏈表
    2021-10-10
  • Springboot通過圖片路徑形式獲取圖片

    Springboot通過圖片路徑形式獲取圖片

    這篇文章主要介紹了Springboot通過圖片路徑形式獲取圖片,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 簡單了解springboot加載配置文件順序

    簡單了解springboot加載配置文件順序

    這篇文章主要介紹了簡單了解springboot加載配置文件順序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java List集合去重的多種實(shí)現(xiàn)方法

    Java List集合去重的多種實(shí)現(xiàn)方法

    Java中List集合去重的多種方法,包括使用循環(huán)、HashSet、保持順序去重、contain方法去重等,注意在刪除元素時,直接操作會導(dǎo)致ConcurrentModificationException,應(yīng)使用傳統(tǒng)for循環(huán)或倒序刪除
    2025-02-02
  • SpringBoot項(xiàng)目中連接Gauss數(shù)據(jù)庫

    SpringBoot項(xiàng)目中連接Gauss數(shù)據(jù)庫

    本文主要介紹了SpringBoot項(xiàng)目中連接Gauss數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 基于Springboot疫苗接種行程管理系統(tǒng)的設(shè)計與實(shí)現(xiàn)

    基于Springboot疫苗接種行程管理系統(tǒng)的設(shè)計與實(shí)現(xiàn)

    本文主要介紹了基于Springboot實(shí)現(xiàn)的疫苗接種行程管理系統(tǒng)的示例代碼,系統(tǒng)主要實(shí)現(xiàn)個人疫苗接種管理、行程管理、病史管理、風(fēng)險地區(qū)管理、核酸檢測報告結(jié)果上報、疫情新聞管理等功能,需要的可以參考一下
    2022-03-03
  • Mybatis的介紹、基本使用、高級使用

    Mybatis的介紹、基本使用、高級使用

    這篇文章主要介紹了Mybatis的介紹、基本使用、高級使用,Mybatis是一款半自動的ORM持久層框架,具有較高的SQL靈活性,如何使用看這篇就夠了,需要的朋友可以參考下
    2023-03-03
  • java獲取到heapdump文件后快速分析技巧

    java獲取到heapdump文件后快速分析技巧

    大家都知道HeapDump文件是指定時刻的Java堆棧的快照,是一種鏡像文件,今天通過本文給大家介紹java獲取到heapdump文件后,如何快速分析,需要的朋友可以參考下
    2023-04-04
  • java實(shí)現(xiàn)單鏈表、雙向鏈表

    java實(shí)現(xiàn)單鏈表、雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單鏈表、雙向鏈表的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • SpringMVC集成Web與MVC執(zhí)行流程和數(shù)據(jù)響應(yīng)及交互相關(guān)介紹全面總結(jié)

    SpringMVC集成Web與MVC執(zhí)行流程和數(shù)據(jù)響應(yīng)及交互相關(guān)介紹全面總結(jié)

    Spring MVC 是 Spring 提供的一個基于 MVC 設(shè)計模式的輕量級 Web 開發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),這篇文章主要介紹了SpringMVC集成Web與MVC執(zhí)行流程和數(shù)據(jù)響應(yīng)及交互
    2022-10-10

最新評論

西盟| 宜都市| 理塘县| 桐梓县| 绍兴市| 镇远县| 阜康市| 孝义市| 临城县| 东辽县| 玉环县| 东海县| 克什克腾旗| 靖州| 莱芜市| 潼南县| 年辖:市辖区| 河源市| 广水市| 沙坪坝区| 炉霍县| 桂林市| 高安市| 衢州市| 沁源县| 镇康县| 太和县| 嘉义市| 湘阴县| 多伦县| 威信县| 邵武市| 玉树县| 庆云县| 西盟| 钟祥市| 天峻县| 滨海县| 广汉市| 南皮县| 淅川县|