Android 가 위 챗 결제 에 접속 하 는 방법

1.먼저 위 챗 오픈 플랫폼 에서 애플 리 케 이 션 개발 을 신청 하면 위 챗 오픈 플랫폼 은 앱 의 유일한 표지 인 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;
  }
}

여기 서 제 시 된 매개 변 수 는 모두 이동 단 에서 스스로 얻 을 수 있 습 니 다.물론 배경 에서 우리 에 게 제공 하 는 것 이 좋 습 니 다.안전성 을 고려 하여
결제 완료,위 챗 은 WXPayEntry Activity 로 되 돌아 갑 니 다.여 기 는 자세히 말 하지 않 겠 습 니 다.위 챗 문 서 는 분명하게 말 합 니 다.
WXPayEntry Activity 의 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;
      }
    }

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기