Android 微信支付詳解與Demo
最近公司弄Ionic框架,專案中需要微信支付,無奈,把我調過去弄,期間也是幾近崩潰,好在皇天不負有心人,在看別人的文件,終於是在專案中集成了微信支付,下面作為一個小白的我,想要把我的經驗分享給大家,希望對大家有所幫助。
先給一個可用的demo吧(執行前先看txt檔案)
http://download.csdn.net/detail/simon_crystin/9699743;
(溫馨提示:大家下載下來可能會出錯,也有可能不會。下面給出出錯的解決方法:1.進入專案中的WeIXinPay->Build Path->configure build path,移除那個報錯的jar包。 2.會出現資源找不到的情況,這是因為你沒有v7包,下載一個v7包,或者把出錯的地方都刪除,只是一個主題,刪除了看起來不好看而已,當然,你也可以用你有的主題。 還有一個問題需要提出來,就是你可能按照裡面的text操作的仍然調不起客戶端,有可能是你沒有安裝微信客戶端,因為我沒有做判斷。這個demo不會出現只能成功支付一次的情況,博主親測有效。出現只能支付一次只能說明你的簽名沒有對應)
1.去微信開放平臺申請微信支付服務,繫結自己的應用這裡具體不多講,但是一定要申請完成,將會得到是三個引數
//appid 微信分配的公眾賬號ID
public static final String APP_ID = "";
//商戶號 微信分配的公眾賬號ID
public static final String MCH_ID = "";
// API金鑰,在商戶平臺設定
public static final String API_KEY= "";
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
**坑點提示:在微信開發平臺設定包名和簽名。這裡的包名一定要和你自己的包名一樣,就是manifest中的package,簽名一定要和你用官方app生成的一樣(
微信會根據你的填寫的包名,然後對你的keystore進行一種演算法,生成你的簽名。包名和簽名一定要和微信開放平臺的相同。不過這裡需要注意的是,如果你釋出的正式版本,需要用官方app重新生成簽名,然後在開放平臺重新設定sign,因為測試版本的keystore與正式版的keystore不一樣。總之,就是你用的keystore生成的sign要和微信開放平臺的時刻保持一致。**
2.準備工作做好了,接下來就是開發了,先下載微信的jar包,匯入。
微信支付分為三個步驟
1.生成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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.生成簽名引數
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());
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
3.調起支付。
/*
* 調起微信支付
*/
private void sendPayReq() {
msgApi.registerApp(Constants.APP_ID);
msgApi.sendReq(req);
Log.i(">>>>>", req.partnerId);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
下面給出完整程式碼
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();//生成簽名引數
sendPayReq();//調起支付
break;
default:
break;
}
}
/*
* 調起微信支付
*/
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"));//寫你們的回撥地址
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());
}
//生成隨機號,防重發
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;
}
/*
* 轉換成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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
接下來就是有個支付結果的頁面程式碼。是微信官方提供的一個類。你要在manifest註冊這個類。這裡需要注意的是,這個類必須放在wxapi包下,你自己新建一個包即可。
為了大家可以直接執行這個demo,我的微信加簽都是在本地執行的,獲取prepayid和加簽都應該在服務端完成,還有最終的支付返回結果也是以服務端的為準。
*下面給出執行結果圖*
大家下載demo然後把引數換了,弄下keystore,包名,簽名。應該就可以用了。
相關推薦
Android 微信支付詳解與Demo
最近公司弄Ionic框架,專案中需要微信支付,無奈,把我調過去弄,期間也是幾近崩潰,好在皇天不負有心人,在看別人的文件,終於是在專案中集成了微信支付,下面作為一個小白的我,想要把我的經驗分享給大家,希望對大家有所幫助。 先給一個可用的demo吧(執行前先看txt檔案) http://download.csd
(轉)微信小程式API——微信支付詳解(順便講一下我遇見的坑)
https://blog.csdn.net/cwh1010714845/article/details/78944335 學習微信小程式已經半個多月了,終於接觸到小程式中一個很重要的功能——微信支付。接下來就給大家詳細講解一下微信支付功能的呼叫。 一想到微信支
Android第三方繫結微信登入詳解
微信登入官方文件地址:點選進入 一、準備工作 在進行微信登入之前,首先要在微信開放平臺註冊開發者賬號,並擁有一個已稽核通過的移動應用,並獲得相應的AppID和AppSecret,申請微信登入且通過稽核後,可開始接入流程。 微信開放平臺接入地址:點選進入 建立移動應用後獲得
Android 微信支付demo
經常有朋友問我微信支付怎麼做,我就納悶了,微信開發者平臺不是有詳細的介紹和demo嗎?他們說那個demo執行不了,於是今天我就來試了試,果然有問題,不過是小問題,稍微改下就可以了。 首先進入 微信開發者平臺 https://open.weixin.qq.com/cgi-b
Android 微信支付的統一下單
準備工作 申請微信開發者賬號,新增應用及申請開通微信支付功能,如 檢視開通流程 統一下單的介面文件: 檢視介面 開發 ①下載sdk: sdk和demo下載 ②可以匯入包 在build.gradle檔案中,新增如下依賴即可: depende
android 微信支付,body為中文字元,簽名錯誤
微信支付訂單生產方法: /** * 根據您的訂單資訊 生成 微信產品支付訂單資訊 */ private String createWeChatOrder() { StringBuffer xml = new StringBuffer();
android微信支付詳細步驟
此篇僅限於android客戶端整合微信支付 微信支付和支付寶相比的話裡面的坑還是很多的,但是導包導的倒是很簡單,就在在build.gradle檔案中,新增一條依賴就行: dependencies { implementation 'com.tencent.mm.opensdk:wec
layabox 完成微信排行榜 詳解(進行中)
希望在看這篇部落格之前你已經仔細的瞭解過微信的開放(封閉)資料域了; 微信的開放資料域是為了保護微信的資料安全,這裡面一旦涉及到 wx.getgrounp wx.get.... wx.get .... 都將被保護起來,如何保護它允許你在一個封閉的區域裡面讓他顯示出來但
微信支付 java 服務端demo (v3版本app支付 springMVC框架中)
//靜態資源 /** * @author 徐小驥 * @version :2016-5-9 上午11:43:48 */ public class WeixinPayConstants { public static final String appid =
Android微信支付無法掉起支付的原因
1.第一種原因就是上邊的這些引數有問題。一般都是祕鑰有問題。需自己登陸商家版後臺修改 2.需要知道微信支付是需要打包才能執行。這也是蛋疼的一點,測試只能通過log和Toast來推斷。掉不起來可以去微信開放平臺看自己配置的引數是否正確。 3.微信支付跟支付寶支付
Android微信支付,通知回撥方法
import java.io.IOException; import java.io.StringReader; import java.util.HashMap; import java.util.List; import java.util.Map; import j
Android微信支付詳細流程(包括手機端和伺服器端)
相關檔案下載地址:http://download.csdn.net/detail/s_alics/9383437點選開啟連結 **************************************************************************
Android微信支付SDK的細微注意點
首先這個demo是Eclipse專案,在用Eclipse匯入進來後會報"com.tencent.mm.sdk"這個路徑找不到,原因有2個: 1.wechat-sdk-android-with-mta的包沒有匯入,右鍵選中包,build path->add to l
android 微信支付 + node.js 服務端
實現微信支付有很多方式,至於開始菜鳥的我使用app支付,後期考慮安全性問題,只好把統一下單,得到prepay_id之後再次簽名sign全在服務端寫了,廢話不多說,進入操作。 做任何東西,我喜歡瞭解整個流程,然後一步一步做起來,開始看清微信支付業務流程圖 業務流程步驟寫的很
Android微信開放平臺SDK, demo除錯
此文轉載,最後一段文字,沒看懂什麼意思,有意的大俠們請指教啊,跪拜……………… 最近一直在呼叫微信的API,卻發現一直呼叫不成功,糾結了好久,各方面找教程,找官方,官方里的文件也只是寫得很模糊,說是按三步走。 1、申請App_ID 2、填寫包名3、 獲取程式簽名的
關於android微信支付 和 支付寶支付的整合
最近專案中要整合微信和支付寶支付 在沒有接觸支付之間 覺得還是比較難的 但真正去實現的時候還是比較簡單的 就是有不少坑要去踩過之後才知道 支付寶支付 : 對於支付寶支付 我個人理解還是比較簡單的 https://open.alipay.com/platform/home.h
nodejs爬蟲抓取搜狗微信文章詳解
成果 展示地址 使用模組 async -- 非同步流程控制 基本使用request -- 抓取網站模組 官網cheerio -- 處理html模組 官網 思路 爬取的思路 : 從搜尋開始 ->
Android微信支付整合和踩過的坑
近公司需要微信支付,所以不得不去看看微信支付文件。但是你懂得,那文件寫的真帶勁,看不懂。我直接放棄,開始整合。但是調起微信支付的時候:結果碼為-1,心裡一驚,肯定哪裡錯了,就開始找坑。所以把自己解決的過程分享給大家,讓整合微信支付成為很容易的一件事。 2、我們需要的資源
Android微信支付、支付寶接入總結
public class AliPay { /*支付寶支付結果碼*/ private static final String PAY_OK = "9000";// 支付成功 private static final String PAY_WAIT_CONFIRM = "8
Android微信支付接入
前言:本文主要說明如何在Android專案中接入微信支付,介紹微信支付在專案中的配置,分析微信支付資料與其互動流程,分享個人遇到的坑,以幫助有需要的朋友能更快的在專案中進行微信支付的接入。 正文: 1,開發資質申請: 這個過程在本文中不詳細介紹,總的來說需要企業資質申請微信支