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

Android編程實現(xiàn)的微信支付功能詳解【附Demo源碼下載】

 更新時間:2017年07月11日 11:00:49   作者:Simon_Crystin  
這篇文章主要介紹了Android編程實現(xiàn)的微信支付功能,結(jié)合實例形式詳細(xì)分析了Android微信支付功能的實現(xiàn)步驟與具體操作技巧,并附帶了Demo源碼供讀者下載參考,需要的朋友可以參考下

本文實例講述了Android編程實現(xiàn)的微信支付功能。分享給大家供大家參考,具體如下:

最近公司弄Ionic框架,項目中需要微信支付,無奈,把我調(diào)過去弄,期間也是幾近崩潰,好在皇天不負(fù)有心人,在看別人的文檔,終于是在項目中集成了微信支付,下面作為一個小白的我,想要把我的經(jīng)驗分享給大家,希望對大家有所幫助。

先給一個可用的demo吧(運行前先看txt文件)

demo代碼點擊此處本站下載。

這個demo是基于eclipse開發(fā)的,博主也在Android Studio開發(fā)過微信支付,原理都是一樣的,大家把這個demo弄懂了,在AS上面也是一樣的。

(溫馨提示:大家下載下來可能會出錯,也有可能不會。下面給出出錯的解決方法:1.進(jìn)入項目中的WeIXinPay->Build Path->configure build path,移除那個報錯的jar包。 2.會出現(xiàn)資源找不到的情況,這是因為你沒有v7包,下載一個v7包,或者把出錯的地方都刪除,只是一個主題,刪除了看起來不好看而已,當(dāng)然,你也可以用你有的主題。 還有一個問題需要提出來,就是你可能按照里面的text操作的仍然調(diào)不起客戶端,有可能是你沒有安裝微信客戶端,因為我沒有做判斷。這個demo不會出現(xiàn)只能成功支付一次的情況,博主親測有效。出現(xiàn)只能支付一次只能說明你的簽名沒有對應(yīng))

1. 去微信開放平臺申請微信支付服務(wù),綁定自己的應(yīng)用這里具體不多講,但是一定要申請完成,將會得到是三個參數(shù)

//appid 微信分配的公眾賬號ID
public static final String APP_ID = "";
//商戶號 微信分配的公眾賬號ID
public static final String MCH_ID = "";
// API密鑰,在商戶平臺設(shè)置
public static final String API_KEY= "";

**坑點提示:在微信開發(fā)平臺設(shè)置包名和簽名。這里的包名一定要和你自己的包名一樣,就是manifest中的package,簽名一定要和你用官方app生成的一樣(https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk)。

微信會根據(jù)你的填寫的包名,然后對你的keystore進(jìn)行一種算法,生成你的簽名。包名和簽名一定要和微信開放平臺的相同。不過這里需要注意的是,如果你發(fā)布的正式版本,需要用官方app重新生成簽名,然后在開放平臺重新設(shè)置sign,因為測試版本的keystore與正式版的keystore不一樣??傊?,就是你用的keystore生成的sign要和微信開放平臺的時刻保持一致。**

2. 準(zhǔn)備工作做好了,接下來就是開發(fā)了,先下載微信的jar包,導(dǎo)入。

微信支付分為三個步驟

① .生成prepayId

@Override
protected Map<String, String> doInBackground(String... params) {
      // TODO Auto-generated method stub
      String url=String.format(params[0]);
      String entity=getProductArgs();
      Log.e("Simon",">>>>"+entity);
      byte[] buf=Util.httpPost(url, entity);
      String content = new String(buf);
      Log.e("orion", "----"+content);
      Map<String,String> xml=decodeXml(content);
      return xml;
}

② .生成簽名參數(shù)

private void genPayReq() {
    req.appId = Constants.APP_ID;
    req.partnerId = Constants.MCH_ID;
    if (resultunifiedorder!=null) {
      req.prepayId = resultunifiedorder.get("prepay_id");
      req.packageValue = "prepay_id="+resultunifiedorder.get("prepay_id");
    }
    else {
      Toast.makeText(MainActivity.this, "prepayid為空", Toast.LENGTH_SHORT).show();
    }
    req.nonceStr = getNonceStr();
    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");
    textView.setText(sb.toString());
    Log.e("Simon", "----"+signParams.toString());
}

③ .調(diào)起支付

/*
* 調(diào)起微信支付
*/
private void sendPayReq() {
    msgApi.registerApp(Constants.APP_ID);
    msgApi.sendReq(req);
    Log.i(">>>>>", req.partnerId);
}

下面給出完整代碼 

package com.alpha.live;
import java.io.StringReader;
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.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.AlertDialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
/**
 * Created by Simon on 2016/12/2.
 */
public class MainActivity extends Activity implements OnClickListener {
  private Button submitButton;
  private Button confirmButton;
  private TextView textView;
  private StringBuffer sb;
  private Map<String,String> resultunifiedorder;
  private PayReq req;
  private final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    submitButton=(Button) findViewById(R.id.bt_submit_order);
    confirmButton=(Button) findViewById(R.id.bt_corfirm);
    textView=(TextView) findViewById(R.id.tv_prepay_id);
    submitButton.setOnClickListener(this);
    confirmButton.setOnClickListener(this);
    sb=new StringBuffer();
    req=new PayReq();
  }
  @Override
  public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.bt_submit_order:
      String urlString="https://api.mch.weixin.qq.com/pay/unifiedorder";
       PrePayIdAsyncTask prePayIdAsyncTask=new PrePayIdAsyncTask();
       prePayIdAsyncTask.execute(urlString);   //生成prepayId
    break;
    case R.id.bt_corfirm:
      genPayReq();//生成簽名參數(shù)
      sendPayReq();//調(diào)起支付
    break;
    default:
      break;
    }
  }
  /*
   * 調(diào)起微信支付
   */
  private void sendPayReq() {
    msgApi.registerApp(Constants.APP_ID);
    msgApi.sendReq(req);
    Log.i(">>>>>", req.partnerId);
  }
  private long genTimeStamp() {
    return System.currentTimeMillis() / 1000;
  }
  private void genPayReq() {
    req.appId = Constants.APP_ID;
    req.partnerId = Constants.MCH_ID;
    if (resultunifiedorder!=null) {
      req.prepayId = resultunifiedorder.get("prepay_id");
      req.packageValue = "prepay_id="+resultunifiedorder.get("prepay_id");
    }
    else {
      Toast.makeText(MainActivity.this, "prepayid為空", Toast.LENGTH_SHORT).show();
    }
    req.nonceStr = getNonceStr();
    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");
    textView.setText(sb.toString());
    Log.e("Simon", "----"+signParams.toString());
  }
  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.API_KEY);
    this.sb.append("sign str\n"+sb.toString()+"\n\n");
    String appSign = MD5.getMessageDigest(sb.toString().getBytes());
    Log.e("Simon","----"+appSign);
    return appSign;
  }
  private class PrePayIdAsyncTask extends AsyncTask<String,Void, Map<String, String>>
  {
    private ProgressDialog dialog;
    @Override
    protected void onPreExecute() {
      // TODO Auto-generated method stub
      super.onPreExecute();
      dialog = ProgressDialog.show(MainActivity.this, "提示", "正在提交訂單");
    }
    @Override
    protected Map<String, String> doInBackground(String... params) {
      // TODO Auto-generated method stub
      String url=String.format(params[0]);
      String entity=getProductArgs();
      Log.e("Simon",">>>>"+entity);
      byte[] buf=Util.httpPost(url, entity);
      String content = new String(buf);
      Log.e("orion", "----"+content);
      Map<String,String> xml=decodeXml(content);
      return xml;
    }
    @Override
    protected void onPostExecute(Map<String, String> result) {
      // TODO Auto-generated method stub
      super.onPostExecute(result);
      if (dialog != null) {
        dialog.dismiss();
      }
      sb.append("prepay_id\n"+result.get("prepay_id")+"\n\n");
      textView.setText(sb.toString());
      resultunifiedorder=result;
    }
  }
  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){
            //實例化student對象
            xml.put(nodeName,parser.nextText());
          }
          break;
        case XmlPullParser.END_TAG:
          break;
        }
        event = parser.next();
      }
      return xml;
    } catch (Exception e) {
      Log.e("Simon","----"+e.toString());
    }
    return null;
  }
  private String getProductArgs() {
    // TODO Auto-generated method stub
    StringBuffer xml=new StringBuffer();
    try {
      String nonceStr=getNonceStr();
      xml.append("<xml>");
      List<NameValuePair> packageParams=new LinkedList<NameValuePair>();
      packageParams.add(new BasicNameValuePair("appid",Constants.APP_ID));
      packageParams.add(new BasicNameValuePair("body", "APP pay test"));
      packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
      packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
      packageParams.add(new BasicNameValuePair("notify_url", "https://www.baidu.com"));//寫你們的回調(diào)地址
      packageParams.add(new BasicNameValuePair("out_trade_no",genOutTradNo()));
      packageParams.add(new BasicNameValuePair("total_fee", "1"));
      packageParams.add(new BasicNameValuePair("trade_type", "APP"));
      String sign=getPackageSign(packageParams);
      packageParams.add(new BasicNameValuePair("sign", sign));
      String xmlString=toXml(packageParams);
      return xmlString;
    } catch (Exception e) {
      // TODO: handle exception
      return null;
    }
  }
  //生成訂單號,測試用,在客戶端生成
  private String genOutTradNo() {
    Random random = new Random();
//   return "dasgfsdg1234"; //訂單號寫死的話只能支付一次,第二次不能生成訂單
    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
  }
  //生成隨機(jī)號,防重發(fā)
  private String getNonceStr() {
    // TODO Auto-generated method stub
    Random random=new Random();
    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
  }
  /**
   生成簽名
   */
  private String getPackageSign(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.API_KEY);
    String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
    Log.e("Simon",">>>>"+packageSign);
    return packageSign;
  }
  /*
   * 轉(zhuǎn)換成xml
   */
  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("Simon",">>>>"+sb.toString());
    return sb.toString();
  }
}

接下來就是有個支付結(jié)果的頁面代碼。是微信官方提供的一個類。你要在manifest注冊這個類。這里需要注意的是,這個類必須放在wxapi包下,你自己新建一個包即可。

為了大家可以直接運行這個demo,我的微信加簽都是在本地執(zhí)行的,獲取prepayid和加簽都應(yīng)該在服務(wù)端完成,還有最終的支付返回結(jié)果也是以服務(wù)端的為準(zhǔn)。

*下面給出運行結(jié)果圖*

大家下載demo然后把參數(shù)換了,弄下keystore,包名,簽名。應(yīng)該就可以用了。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • Android?Flutter實現(xiàn)任意拖動的控件

    Android?Flutter實現(xiàn)任意拖動的控件

    使用flutter開發(fā)是需要控件能拖動,比如畫板中的元素,或者工具條等,所以本文為大家準(zhǔn)備了Flutter實現(xiàn)任意拖動控件的示例代碼,希望對大家有所幫助
    2023-07-07
  • Android仿知乎日報開屏頁效果

    Android仿知乎日報開屏頁效果

    這篇文章主要為大家詳細(xì)介紹了Android仿知乎日報開屏頁效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android開發(fā)之高德地圖實現(xiàn)定位

    Android開發(fā)之高德地圖實現(xiàn)定位

    本篇文章主要介紹了Android中高德地圖實現(xiàn)定位的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Android ScrollView顯示到底部或任意位置實現(xiàn)代碼

    Android ScrollView顯示到底部或任意位置實現(xiàn)代碼

    這篇文章主要介紹了 Android ScrollView顯示到底部或任意位置實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Flutter 日期時間DatePicker控件及國際化

    Flutter 日期時間DatePicker控件及國際化

    這篇文章主要介紹了Flutter 日期時間DatePicker控件及國際化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Android Mainline基礎(chǔ)簡介

    Android Mainline基礎(chǔ)簡介

    Android Mainline 是通過模塊化更新 Android 核心組件的框架,可能提高安全性,本文給大家介紹Android Mainline基礎(chǔ)簡介,感興趣的朋友一起看看吧
    2025-04-04
  • Android WebView那些坑之上傳文件示例

    Android WebView那些坑之上傳文件示例

    本篇文章主要介紹了Android WebView那些坑之上傳文件示例,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • Android完全退出應(yīng)用程序的方法

    Android完全退出應(yīng)用程序的方法

    這篇文章主要介紹了Android完全退出應(yīng)用程序的方法,實例分析了Android退出應(yīng)用程序的相關(guān)方法與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Android實現(xiàn)C/S聊天室

    Android實現(xiàn)C/S聊天室

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)C/S聊天室的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • android圖像繪制(五)畫布保存為指定格式/大小的圖片

    android圖像繪制(五)畫布保存為指定格式/大小的圖片

    將圖片進(jìn)行編輯(放縮,涂鴉等),最后保存成指定格式、大小的圖片,接下來將介紹保存方法,感興趣的朋友可以了解下啊
    2013-01-01

最新評論

扎鲁特旗| 乌拉特后旗| 绥宁县| 南川市| 明星| 奉节县| 盘山县| 灵川县| 新营市| 如东县| 山东省| 莱芜市| 栾川县| 福海县| 思茅市| 绵阳市| 石首市| 大冶市| 龙里县| 浦北县| 宁津县| 伊川县| 逊克县| 沧源| 汶上县| 灵璧县| 白山市| 卓尼县| 兴业县| 平和县| 清徐县| 张家口市| 安岳县| 海丰县| 绥棱县| 古丈县| 屏东县| 安图县| 建宁县| 盈江县| 清苑县|