Android實(shí)現(xiàn)微信支付的統(tǒng)一下單
本文實(shí)例為大家分享了Android實(shí)現(xiàn)微信支付統(tǒng)一下單的具體代碼,供大家參考,具體內(nèi)容如下
準(zhǔn)備工作
申請(qǐng)微信開(kāi)發(fā)者賬號(hào),添加應(yīng)用及申請(qǐng)開(kāi)通微信支付功能,如
查看開(kāi)通流程
統(tǒng)一下單的接口文檔:
查看接口
開(kāi)發(fā)
①下載sdk:
②可以導(dǎo)入包
在build.gradle文件中,添加如下依賴(lài)即可:
dependencies { compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' }
或
dependencies { compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+' }
③添加Android Manifest權(quán)限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
調(diào)用統(tǒng)一下單接口
1.務(wù)必提交必須的字段:appid,body,mch_id,nonce_str,notify_url, out_trade_no,spbill_create_ip,total_fee,trade_type,sign(都是小寫(xiě));提交到微信接口時(shí)以xml格式提交
2.sign為前面提交的參數(shù)按照參數(shù)名ASCII碼從小到大排序簽名拼接起來(lái)然后進(jìn)行MD5運(yùn)算,再將得到的字符串所有字符轉(zhuǎn)換為大寫(xiě)得到的,如簽名生成算法
3.參與生成sign的key為商戶(hù)賬號(hào)的密鑰,key設(shè)置路徑如下:微信商戶(hù)平臺(tái)(pay.weixin.qq.com)–>賬戶(hù)設(shè)置–>API安全–>密鑰設(shè)置
下面是具體代碼(如若查看你的sign生成及提交的xml是否正確可以點(diǎn)擊如下:簽名生成工具)
//拼接字段,順序不能變 String A = "appid=你的appID" + "&body=jinshi" + "&mch_id=你的商戶(hù)號(hào)" + "&nonce_str=" + nonce_str + "¬ify_url=http://www.szgsip.com/" + "&out_trade_no=" + trade_no + "&spbill_create_ip=192.168.1.1" + "&total_fee=1" + "&trade_type=APP"; String key = "你的密鑰"; String temp = A + "&key=" + key; // 生成sign String sign = MD5.getMessageDigest(temp.getBytes()).toUpperCase();
接下來(lái)提交到微信下單的接口上
private void httpThreadxml() { //組建xml數(shù)據(jù) //拼接字段,順序不能變 xml.append("<xml>\n"); xml.append("<appid>你的appID</appid>\n"); xml.append("<body>jinshi</body>\n"); xml.append("<mch_id>你的商戶(hù)號(hào)</mch_id>\n"); xml.append("<nonce_str>" + nonce_str + "</nonce_str>\n"); xml.append("<notify_url>http://www.szgsip.com/</notify_url>\n"); xml.append("<out_trade_no>" + trade_no + "</out_trade_no>\n"); xml.append("<spbill_create_ip>192.168.1.1</spbill_create_ip>\n"); xml.append("<total_fee>1</total_fee>\n"); xml.append("<trade_type>APP</trade_type>\n"); xml.append("<sign>" + sign + "</sign>\n"); xml.append("</xml>"); try { final byte[] xmlbyte = xml.toString().getBytes("UTF-8"); System.out.println(xml); URL url = new URL("https://api.mch.weixin.qq.com/pay/unifiedorder"); final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setDoOutput(true);// 允許輸出 conn.setDoInput(true); conn.setUseCaches(false);// 不使用緩存 conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive");// 維持長(zhǎng)連接 conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Length", String.valueOf(xmlbyte.length)); conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8"); conn.setRequestProperty("X-ClientType", "2");//發(fā)送自定義的頭信息 conn.getOutputStream().write(xmlbyte); conn.getOutputStream().flush(); conn.getOutputStream().close(); if (conn.getResponseCode() != 200) throw new RuntimeException("請(qǐng)求url失敗"); InputStream is = conn.getInputStream();// 獲取返回?cái)?shù)據(jù) // 使用輸出流來(lái)輸出字符(可選) ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int len; while ((len = is.read(buf)) != -1) { out.write(buf, 0, len); } String string = out.toString("UTF-8"); System.out.println(string); Log.e(" 微信返回?cái)?shù)據(jù) ", " --- " + string); out.close(); } catch (Exception e) { System.out.println(e); } }
注意在調(diào)用上面的方法,一定要在子線(xiàn)程中進(jìn)行
new Thread(new Runnable() { @Override public void run() { httpThreadxml(); } }).start();
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File
這篇文章主要介紹了淺談Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer的相關(guān)資料,需要的朋友可以參考下2017-11-11Android實(shí)現(xiàn)多線(xiàn)程下載文件的方法
這篇文章主要介紹了Android實(shí)現(xiàn)多線(xiàn)程下載文件的方法,以實(shí)例形式較為詳細(xì)的分析了Android多線(xiàn)程文件傳輸及合并等操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10android: targetSdkVersion升級(jí)中Only fullscreen activities can r
這篇文章主要給大家介紹了關(guān)于A(yíng)ndroid target SDK和build tool版本升級(jí)中遇到Only fullscreen activities can request orientation問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09Android獲取arrays.xml里的數(shù)組字段值實(shí)例詳解
這篇文章主要介紹了Android獲取arrays.xml里的數(shù)組字段值實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Android ProgressBar直線(xiàn)進(jìn)度條的實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了android progressbar直線(xiàn)進(jìn)度條的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-06-06Android?Jetpack?Compose開(kāi)發(fā)實(shí)用小技巧
這篇文章主要為大家介紹了Android?Jetpack?Compose開(kāi)發(fā)中的一些實(shí)用小技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問(wèn)題小結(jié)
這篇文章給大家介紹了Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問(wèn)題,在沒(méi)給大家介紹這下問(wèn)題之前,先給大家說(shuō)下基本定義和基本使用方式,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,對(duì)android 6.0 動(dòng)態(tài)權(quán)限遇到問(wèn)題感興趣的朋友一起看看吧2016-11-11Android編程判斷當(dāng)前應(yīng)用是否在后臺(tái)運(yùn)行的方法示例
這篇文章主要介紹了Android編程判斷當(dāng)前應(yīng)用是否在后臺(tái)運(yùn)行的方法,涉及Android針對(duì)當(dāng)前程序運(yùn)行狀態(tài)相關(guān)屬性操作與判定技巧,需要的朋友可以參考下2018-03-03Android實(shí)現(xiàn)拍照或者選取本地圖片
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照或者選取本地圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Android studio so庫(kù)找不到問(wèn)題解決辦法
這篇文章主要介紹了Android studio so庫(kù)找不到問(wèn)題解決辦法的相關(guān)資料,希望通過(guò)本文能幫助到大家解決出現(xiàn)的這種問(wèn)題,需要的朋友可以參考下2017-10-10