Android第三方微信支付教程
做了微信支付,下載了Demo,發(fā)現(xiàn)和之前有所改動,v3.0的版本,也許有的朋友還在摸索,這里我已經(jīng)成功支付,話不多說,直接進入主題:
一、首先要在微信開發(fā)平臺注冊賬號,新增應(yīng)用,填寫正確的包名,正確的簽名(MD5中的一串字符冒號去掉,全部小寫),當然也會生成的AppID和AppSecret都有用!最后還要花300大洋開通支付功能!
二、分析一下微信支付的流程
三、界面交互流程
上面都看明白了,接下來就是寫代碼了
四、這里必須要有wxapi這個包名,同時必須有WXPayEntryActivity這個類名
五、在AndroidManifest.xml里面配置相關(guā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"/> <!-- 啟動主頁面 --> <activity android:name=".ui.activity.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="wx487898a262d23df3" /> </intent-filter> </activity> <activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:label="@string/title_activity_wxpayentry" android:launchMode="singleTop" /> <receiver android:name=".wxpay.AppRegister" android:permission="com.tencent.mm.plugin.permission.SEND" > <intent-filter> <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" /> </intent-filter> </receiver> /** * 首先調(diào)用接口,要把一些基本信息作為參數(shù)傳給服務(wù)器 * 比如:金額fee,用戶id,標題title等 * 調(diào)用成功之后會返回微信所需要的參數(shù),如: * appid,noncestr,package,partnerid,prepayid, * timestamp,sign * 微信支付 */ StringBuffer sb = new StringBuffer(); WeixinPay wpay; private AlertDialog mDialog; private AlertDialog.Builder builder; public void weixinPay() { // 通過WXAPIFactory工廠,獲取IWXAPI的實例 api = WXAPIFactory.createWXAPI(this, Constants.APP_ID); // 將該app注冊到微信 api.registerApp(Constants.APP_ID); // 調(diào)用接口 Params p = new Params(); p.put("fee",fee); p.put("spbill_create_ip", NetWorkUtils.getLocalIpAddress(this)); String value = "商品標題 " + title; try { String title = new String(value.getBytes("UTF-8")); p.put("body", title); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } p.put("userId", O.getUser().getId()); p.post(C.URL.WEIXIN_PAY, new ReHandler() { @Override public void onSuccess(NetEntity entity) { wpay = entity.toObj(WeixinPay.class); PayReq req = new PayReq(); req.appId = wpay.getAppid();// 微信appId req.packageValue = wpay.getPackageValue();// 包 req.extData = "app data"; // optional req.timeStamp = wpay.getTimeStamp();// 時間戳 req.partnerId = wpay.getPartnerId();// 商戶號" req.prepayId = wpay.getPrepayId();// 預支付訂單號 req.nonceStr = wpay.getNonceStr();// 隨機字符串 req.sign = wpay.getSign();// 后臺返回的簽名 // 本地再次簽名 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); // 調(diào)微信支付 if(api.isWXAppInstalled()&&api.isWXAppSupportAPI()){ api.sendReq(req); }else{ builder = new AlertDialog.Builder(WXPayEntryActivity.this); builder.setNeutralButton("關(guān)閉", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mDialog.dismiss(); } }).setTitle("友情提醒").setMessage("請安裝微信客戶端"); mDialog = builder.create(); mDialog.show(); } } @Override public void onStart() { } @Override public void onFailure(String message) { } }); } 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("orion", appSign); return appSign; }
六、在WXPayEntryActivity類里面成功之后回調(diào)方法onResp()
@Override public void onResp(BaseResp resp) { Log.d(TAG, "onPayFinish, errCode = " + resp.errCode); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { if(resp.errCode==-2){ Toast.makeText(this,"取消付款!", Toast.LENGTH_LONG).show(); } if(resp.errCode==-1){ Toast.makeText(this,"支付錯誤!", Toast.LENGTH_LONG).show(); } if(resp.errCode==0){ queryOrder();//查詢接口調(diào)用后臺服務(wù)器查詢是否成功 } }
最后做完之后,一定要簽名打包,這個是微信的獨家秘笈,你忘了就會跳出-1,呵呵。
最后總結(jié)一下支付返回-1的情況
1.檢查微信后臺的簽名,包名是否正確
2.工程是否簽名打包
3.如果之前做過測試顯示過-1的情況,必須清除微信的清除數(shù)據(jù),重新登錄微信
4.后臺服務(wù)器是否按照要求第一次簽名,第二次簽名,如果第二次簽名不對,那我們就自己再次簽名一次,我的代碼里面寫了
以上就是微信支付的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android之利用EventBus發(fā)送消息傳遞示例
本篇文章主要介紹了Android之利用EventBus進行消息傳遞示例。EventBus是一款針對Android優(yōu)化的發(fā)布/訂閱事件總線,非常具有實用價值,需要的朋友可以參考下。2017-02-02Android使用URL讀取網(wǎng)絡(luò)資源的方法
這篇文章主要為大家詳細介紹了Android使用URL讀取網(wǎng)絡(luò)資源的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Android使用LinearLayout設(shè)置邊框
這篇文章主要介紹了Android如何使用LinearLayout設(shè)置邊框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09基于android示例程序(bitmapfun) 高效加載圖片讓人無語地方
嘗試了使用git上的一個開源項目afinal(bitmapfun的封裝版)來加載圖片,但是在測試的時候發(fā)現(xiàn)了一個問題,新的圖片加載器(bitmapfun)比之前用的ImageDownloader要慢很多,特別是在網(wǎng)絡(luò)狀況不好的時候,那簡直是太讓人無語了2013-04-04ViewDragHelper實現(xiàn)QQ側(cè)滑效果
這篇文章主要為大家詳細介紹了ViewDragHelper實現(xiàn)QQ側(cè)滑效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08解決Android Studio4.1沒有Gsonfomat插件,Plugin “GsonFormat” is inco
這篇文章主要介紹了解決Android Studio4.1沒有Gsonfomat插件,Plugin “GsonFormat” is incompatible (supported only in IntelliJ IDEA)的問題 ,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-12-12