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

Android—基于微信開放平臺(tái)v3SDK開發(fā)(微信支付填坑)

 更新時(shí)間:2016年11月21日 11:28:59   作者:奮斗者—cyf  
這篇文章主要介紹了Android—基于微信開放平臺(tái)v3SDK開發(fā)(微信支付填坑),具有一定的參考價(jià)值,有需要的可以了解一下。

接觸微信支付之前聽說過這是一個(gè)坑,,,心里已經(jīng)有了準(zhǔn)備。。。我以為我沒準(zhǔn)跳坑出不來了,沒有想到我填上了,調(diào)用成功之后我感覺公司所有的同事都是漂亮的,隔著北京的大霧霾我仿佛看見了太陽~~~好了,裝逼結(jié)束。。。進(jìn)入正題

開發(fā)準(zhǔn)備:

1.在微信開放平臺(tái)申請(qǐng)賬號(hào)

2.成功后創(chuàng)建應(yīng)用,就是填一些看似很官方很正經(jīng)的資料了。。。(說審核7天左右,沒有意外的情況下你的app第二天就審核成功了是不是很開心,有了appid,是不是就可以調(diào)用微   信支付了????-------想多了,真的)

3.微信支付是需要額外申請(qǐng)的:需要資料審核,賬戶驗(yàn)證,協(xié)議簽署等步驟,(我記得,,資料審核要填寫的東西好多,,,好多,,,賬戶驗(yàn)證就是你審核成功后微信會(huì)發(fā)送郵件到你   注冊(cè)時(shí)登記的郵箱賬號(hào),其中含有隨機(jī)金額用于賬戶驗(yàn)證,協(xié)議簽署,略,太簡(jiǎn)單)一定要好好閱讀你郵件的任何信息,因?yàn)橛械募?xì)節(jié)錯(cuò)了,,,你可能填坑很久。。。。。。

正式開發(fā)階段:

問題1:

調(diào)用官方的SDK發(fā)現(xiàn)只能成功的調(diào)起一次微信,再次支付的時(shí)候怎么也調(diào)用不起來了

解決:

似乎不是什么正經(jīng)方法:在手機(jī)設(shè)置中管理應(yīng)用程序,清除微信數(shù)據(jù),緩存,,再來一遍,絕對(duì)可以調(diào)起來(當(dāng)然還是只是一次。。。。)

繼續(xù):

我認(rèn)為要用微信支付嘛,,就只看了調(diào)用支付接口的文檔:
后來發(fā)現(xiàn)需要的參數(shù)prepayid是怎么也找不到啊,,后來才發(fā)現(xiàn)這個(gè)prepayid是先調(diào)用”統(tǒng)一下單“這個(gè)接口時(shí)候溫馨反過來的東西,但是官方的SDK中并沒有統(tǒng)一下單的代碼。坑嗎???

所以要先看統(tǒng)一下單文檔了

1.使用自己的APP調(diào)用的時(shí)候把官網(wǎng)down下來的SDK中WXPayEntryActivity拷貝到自己的項(xiàng)目,所在包的名字最后一定是.wxapi(我連包一起拷了。。。。)

2.在項(xiàng)目清單文件中填寫:

3.SDK中的AppRegister拷貝下來,,,里面換成你自己的appid,然后在項(xiàng)目清單中也注冊(cè)一下。
4.重點(diǎn)來了,,就是你APP要調(diào)微信支付的activity,我這還叫PayActivity

要調(diào)起微信支付頁面,要在這個(gè)activity中,將你的app注冊(cè)到微信
 接下來先調(diào)用統(tǒng)一下單獲取prepayid,參數(shù),微信人家要xml格式的!我們就得發(fā)送xml格式的!
好了調(diào)用的時(shí)候把這個(gè)方法的返回值當(dāng)參數(shù)傳,,等待微信返回success吧!。。

 我遇見的錯(cuò)誤:簽名錯(cuò)誤

我的原因是大意了 ConfigUtil.NOTIFY_URL這個(gè)參數(shù)寫的空字符串

還有是因?yàn)閐ebug版運(yùn)行的,沒有打包運(yùn)行

返回成功之后,可以調(diào)用支付接口了

不要忘了這一步去跳轉(zhuǎn)界面,,,,,

沒有跳轉(zhuǎn)到微信支付可能是你由運(yùn)行的debug版本,,,,沒有打包。。。。。

下面是我的PayActivity完整代碼:

package com.example.taijiapp.ui;
 
import java.io.StringReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
 
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.xmlpull.v1.XmlPullParser;
 
import com.example.taijiapp.R;
import com.example.taijiapp.util.Constants;
import com.example.taijiapp.util.MD5;
import com.example.taijiapp.util.T;
import com.example.taijiapp.util.Util;
import com.example.taijiapp.utils.ConfigUtil;
import com.tencent.mm.sdk.modelpay.PayReq;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.widget.Button;
 
public class PayActivity extends Activity {
  PayReq req;
  private IWXAPI msgApi;
  Map<string, string=""> resultunifiedorder;
  StringBuffer sb;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pay);
    req = new PayReq();
    sb = new StringBuffer();
    msgApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
    /**
     * 將app注冊(cè)到微信
     */
    boolean registerApp = msgApi.registerApp(Constants.APP_ID);
    T.show(this, "注冊(cè)========"+registerApp+"");
    Button appayBtn = (Button) findViewById(R.id.appay_btn);
    Button check_pay_btn = (Button) findViewById(R.id.check_pay_btn);
    appayBtn.setOnClickListener(new View.OnClickListener() {
 
      @Override
      public void onClick(View v) {
        GetPrepayIdTask getPrepayId = new GetPrepayIdTask();
        getPrepayId.execute();
      }
    });
    /**
     * 將該app注冊(cè)到微信
     */
    check_pay_btn.setOnClickListener(new View.OnClickListener() {
 
      @Override
      public void onClick(View v) {
        genPayReq();
        sendPayReq();
         
      }
    });
//   // 生成簽名參數(shù)
//   Button appay_pre_btn = (Button) findViewById(R.id.appay_pre_btn);
//   appay_pre_btn.setOnClickListener(new View.OnClickListener() {
//
//     @Override
//     public void onClick(View v) {
//       genPayReq();
//     }
//   });
  }
  /**
   * 生成簽名
   */
 
  private String genPackageSign(List<namevaluepair> params) {
    StringBuilder sb = new StringBuilder();
 
    for (int i = 0; i < params.size(); i++) {
      sb.append(params.get(i).getName());
      sb.append('=');
      sb.append(params.get(i).getValue());
      sb.append('&');
    }
    sb.append("key=");
    sb.append(Constants.KEY);
    Log.e("拼接=====", sb.toString());
    String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
    Log.e("orion生成簽名===", packageSign);
    return packageSign;
  }
 
  /**
   * 簽名工具 不含商戶密鑰 -暫時(shí)不用 = * 編碼格式 UTF-8 = * @return
   */
  public static String createSignNoKey(List<namevaluepair> params) {
    StringBuilder sb = new StringBuilder();
 
    for (int i = 0; i < params.size(); i++) {
      sb.append(params.get(i).getName());
      sb.append('=');
      sb.append(params.get(i).getValue());
      sb.append('&');
    }
    String signStr = sb.toString();
    String subStr = signStr.substring(0, signStr.length() - 1);
    // 注意sign轉(zhuǎn)為大寫
    return MD5.getMessageDigest(subStr.getBytes()).toUpperCase();
  }
 
  private String genAppSign(List<namevaluepair> params) {
    StringBuilder sb = new StringBuilder();
 
    for (int i = 0; i < params.size(); i++) {
      sb.append(params.get(i).getName());
      sb.append('=');
      sb.append(params.get(i).getValue());
      sb.append('&');
    }
    sb.append("key=");
    sb.append(Constants.KEY);
 
    this.sb.append("sign str\n" + sb.toString() + "\n\n");
    String appSign = MD5.getMessageDigest(sb.toString().getBytes());
    Log.e("orion", appSign);
    return appSign;
  }
 
  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>");
 
    Log.e("orion", sb.toString());
    return sb.toString();
  }
 
  private class GetPrepayIdTask extends AsyncTask<void, void,="" map<string,="" string="">> {
 
    private ProgressDialog dialog;
 
    @Override
    protected void onPreExecute() {
      dialog = ProgressDialog.show(PayActivity.this, getString(R.string.app_tip),
          getString(R.string.getting_prepayid));
    }
 
    @Override
    protected void onPostExecute(Map<string, string=""> result) {
      if (dialog != null) {
        dialog.dismiss();
      }
      sb.append("prepay_id\n" + result.get("prepay_id") + "\n\n");
 
      resultunifiedorder = result;
 
    }
 
    @Override
    protected void onCancelled() {
      super.onCancelled();
    }
 
    @Override
    protected Map<string, string=""> doInBackground(Void... params) {
 
      String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
      String entity = genProductArgs();
      Log.e("orion===發(fā)送過去", entity);
      byte[] buf = Util.httpPost(url, entity);
 
      String content = new String(buf);
      Log.e("orion", content);
      Map<string, string=""> xml = decodeXml(content);
 
      return xml;
    }
  }
 
  public Map<string, string=""> decodeXml(String content) {
 
    try {
      Map<string, string=""> xml = new HashMap<string, string="">();
      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) == false) {
            // 實(shí)例化student對(duì)象
            xml.put(nodeName, parser.nextText());
          }
          break;
        case XmlPullParser.END_TAG:
          break;
        }
        event = parser.next();
      }
 
      return xml;
    } catch (Exception e) {
      Log.e("orion", e.toString());
    }
    return null;
 
  }
  /**
   * 生成隨機(jī)數(shù)
   * @return
   */
  private String genNonceStr() {
    Random random = new Random();
    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
  }
  /**
   * 時(shí)間戳
   * @return
   */
  private long genTimeStamp() {
    return System.currentTimeMillis() / 1000;
  }
  /**
   * 隨機(jī)數(shù)
   * @return
   */
  private String genOutTradNo() {
    Random random = new Random();
    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
  }
  /**
   * 獲取設(shè)備的ip地址
   * @return
   */
  public String getLocalIpAddress() {
    try {
      for (Enumeration<networkinterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
        NetworkInterface intf = en.nextElement();
        for (Enumeration<inetaddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
          InetAddress inetAddress = enumIpAddr.nextElement();
          if (!inetAddress.isLoopbackAddress()) {
            return inetAddress.getHostAddress().toString();
          }
        }
      }
    } catch (SocketException ex) {
    }
    return null;
  }
 
  private String getWifiIp() {
    // 獲取wifi服務(wù)
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    // 判斷wifi是否開啟
    if (!wifiManager.isWifiEnabled()) {
      wifiManager.setWifiEnabled(true);
    }
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    String ip = intToIp(ipAddress);
    return ip;
  }
  /**
   * 轉(zhuǎn)化成Ip地址的格式
   * @param i
   * @return
   */
  private String intToIp(int i) {
 
    return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + (i >> 24 & 0xFF);
  }
 
  private String genProductArgs() {
    StringBuffer xml = new StringBuffer();
    String ip = getWifiIp();
    if (ip == "" && ip == "") {
      ip = getLocalIpAddress();
    }
    try {
      String nonceStr = genNonceStr();
      xml.append("");
      List<namevaluepair> packageParams = new LinkedList<namevaluepair>();
      packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));
      packageParams.add(new BasicNameValuePair("body", "APPtest"));
      packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
      packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
      packageParams.add(new BasicNameValuePair("notify_url", ConfigUtil.NOTIFY_URL));
      packageParams.add(new BasicNameValuePair("out_trade_no", genOutTradNo()));
      packageParams.add(new BasicNameValuePair("spbill_create_ip", ip));
      packageParams.add(new BasicNameValuePair("total_fee", "100"));
      packageParams.add(new BasicNameValuePair("trade_type", "APP"));
      String sign = genPackageSign(packageParams);
      packageParams.add(new BasicNameValuePair("sign", sign));
      String xmlstring = toXml(packageParams);
      return xmlstring;
    } catch (Exception e) {
      Log.e("TAG", "fail, ex = " + e.getMessage());
      return null;
    }
  }
 
  private void genPayReq() {
    req.appId = Constants.APP_ID;
    req.partnerId = Constants.MCH_ID;
    req.prepayId = resultunifiedorder.get("prepay_id");
    req.packageValue = "prepay_id=" + resultunifiedorder.get("prepay_id");
    req.nonceStr = genNonceStr();
    req.timeStamp = String.valueOf(genTimeStamp());
    List<namevaluepair> signParams = new LinkedList<namevaluepair>();
    signParams.add(new BasicNameValuePair("appid", req.appId));
    signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
    signParams.add(new BasicNameValuePair("package", req.packageValue));
    signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
    signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
    signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
    req.sign = genAppSign(signParams);
    sb.append("sign\n" + req.sign + "\n\n");
    Log.e("orion==genPayReq===============", signParams.toString());
 
  }
 
  private void sendPayReq() {
    boolean sendReq = msgApi.sendReq(req);
    T.show(this, "微信跳轉(zhuǎn)====="+sendReq+"");
  }
 
}
</namevaluepair></namevaluepair></namevaluepair></namevaluepair></inetaddress></networkinterface></string,></string,></string,></string,></string,></string,></void,></namevaluepair></namevaluepair></namevaluepair></namevaluepair></string,>

里面沒有的類,,,,吶:源碼下載。自己下載一下拷貝一下。。。

參考文章:http://m.fzitv.net/article/97712.htm

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

相關(guān)文章

  • Android打開GPS導(dǎo)航并獲取位置信息返回null解決方案

    Android打開GPS導(dǎo)航并獲取位置信息返回null解決方案

    最近在做一個(gè) Android 項(xiàng)目,需要用到GPS獲取位置信息,從 API 查了一下,發(fā)現(xiàn)獲取位置信息僅需極其簡(jiǎn)單的一句即可getLastKnownLocation(LocationManager.GPS_PROVIDER)郁悶的是一直為null,于是搜集整理下,曬出來與大家分享
    2013-01-01
  • Android實(shí)現(xiàn)隱藏狀態(tài)欄和標(biāo)題欄

    Android實(shí)現(xiàn)隱藏狀態(tài)欄和標(biāo)題欄

    這篇文章主要介紹了Android實(shí)現(xiàn)隱藏狀態(tài)欄和標(biāo)題欄的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • Kotlin基礎(chǔ)學(xué)習(xí)之循環(huán)和異常

    Kotlin基礎(chǔ)學(xué)習(xí)之循環(huán)和異常

    最近在學(xué)習(xí)kotlin,Kotlin 是一個(gè)基于 JVM 的新的編程語言,下面這篇文章主要給大家介紹了關(guān)于Kotlin基礎(chǔ)學(xué)習(xí)之循環(huán)和異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • Android基于TextView屬性android:ellipsize實(shí)現(xiàn)跑馬燈效果的方法

    Android基于TextView屬性android:ellipsize實(shí)現(xiàn)跑馬燈效果的方法

    這篇文章主要介紹了Android基于TextView屬性android:ellipsize實(shí)現(xiàn)跑馬燈效果的方法,涉及Android跑馬燈效果所涉及的TextView相關(guān)屬性與使用方法,需要的朋友可以參考下
    2016-08-08
  • 完美解決android 項(xiàng)目jar包沖突的問題

    完美解決android 項(xiàng)目jar包沖突的問題

    這篇文章主要介紹了完美解決android 項(xiàng)目jar包沖突的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android App后臺(tái)震動(dòng)的實(shí)現(xiàn)步驟詳解

    Android App后臺(tái)震動(dòng)的實(shí)現(xiàn)步驟詳解

    這篇文章主要為大家介紹了Android App后臺(tái)震動(dòng)的實(shí)現(xiàn)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Kotlin基礎(chǔ)通關(guān)之字符串與數(shù)字類型

    Kotlin基礎(chǔ)通關(guān)之字符串與數(shù)字類型

    這篇文章主要介紹了Kotlin基礎(chǔ)知識(shí)中的字符串與數(shù)字類型,編程中的入門知識(shí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Android編程解析Json格式數(shù)據(jù)的方法

    Android編程解析Json格式數(shù)據(jù)的方法

    這篇文章主要介紹了Android編程解析Json格式數(shù)據(jù)的方法,涉及Android中json格式數(shù)據(jù)的構(gòu)造、讀取及遍歷等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Android中實(shí)現(xiàn)多線程操作的幾種方式

    Android中實(shí)現(xiàn)多線程操作的幾種方式

    多線程一直是一個(gè)老大難的問題,首先因?yàn)樗y以理解,其次在實(shí)際工作中我們需要面對(duì)的關(guān)于線程安全問題也并不常見,今天就來總結(jié)一下實(shí)現(xiàn)多線程的幾種方式,感興趣的可以了解一下
    2021-06-06
  • Android簡(jiǎn)單使用PopupWindow的方法

    Android簡(jiǎn)單使用PopupWindow的方法

    這篇文章主要為大家詳細(xì)介紹了Android簡(jiǎn)單使用PopupWindow的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03

最新評(píng)論

洪雅县| 大洼县| 剑河县| 武宁县| 桓台县| 苍梧县| 铜川市| 上林县| 同江市| 宣汉县| 平顺县| 蒲城县| 慈利县| 富源县| 丰顺县| 高淳县| 黄冈市| 西藏| 双辽市| 天全县| 志丹县| 南康市| 封开县| 四会市| 呈贡县| 高青县| 崇阳县| 象州县| 纳雍县| 隆子县| 鄂托克旗| 浦城县| 江山市| 八宿县| 大方县| 惠水县| 清丰县| 朝阳市| 甘泉县| 江西省| 共和县|