1. 程式人生 > >Android 微信支付詳解與Demo

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生成的一樣(

https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk)。
微信會根據你的填寫的包名,然後對你的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,開發資質申請: 這個過程在本文中不詳細介紹,總的來說需要企業資質申請微信支