Android微信支付完全解析,權(quán)威版

為什么我敢說是權(quán)威版呢?

我在網(wǎng)上查閱了大量資料拼弃,他們給出的方案都不是最安全的做法,所有的操作都是放在客戶端摇展,而官方推薦的做法是放在服務(wù)器吻氧,支付成敗結(jié)果應(yīng)該由服務(wù)器來同步完成,而我的方案是經(jīng)過重重考驗(yàn)而后得出來的咏连。

Android集成微信支付
微信支付和支付寶支付一樣的盯孙,都可以在客戶端發(fā)起支付并成功通過,但這樣做的漏洞比較大祟滴,所以一定不要通過客戶端直接來完成

1.首先需要 在客戶端向服務(wù)器發(fā)起一個(gè)微信預(yù)支付操作:

請(qǐng)求參數(shù)如下:

body.put("loginUserId", loginUserId );
body.put("title", title);
body.put("business", business);
body.put("orderId", orderId);
body.put("charges", charges); //  注意這里的金額是要在實(shí)際金額*100
body.put("employeeId", employeeId);
body.put("WXAppId", Const.WX_APP_ID);

微信預(yù)支付操作處理后可以從微信服務(wù)器獲取一個(gè)預(yù)支付id振惰,然后再通過預(yù)支付id真正發(fā)起微信支付操作.

 WXPayUtil payUtil = new WXPayUtil(mActivity);
 payUtil.doPayReq(bean.prepay_id);

具體代碼放一下,反正也沒有什么機(jī)密

public class WXPayUtil {
   private PayReq req = null;
   private IWXAPI msgApi = null;
   private StringBuffer sb = null;


   public WXPayUtil(final Activity activity) {
       this.req = new PayReq();
       this.msgApi = WXAPIFactory.createWXAPI(activity, null);
       this.msgApi.registerApp(Constants.APP_ID);
       this.sb = new StringBuffer();
   }


   /**
    * @work:生成簽名參數(shù)
    * @date:2015-9-7 上午11:48:04
    * @author:hg_liuzl@163.com
    * @params:
    */
   public void doPayReq(String prePayId) {
       req.appId = Constants.APP_ID;
       req.partnerId = Constants.MCH_ID;
       req.prepayId = prePayId;
       req.packageValue = "Sign=WXPay";
       req.nonceStr = genNonceStr();
       req.timeStamp = String.valueOf(genTimeStamp());
       List<NameValuePair> signParams = new LinkedList<>();
       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");
       sendPayReq();
   }

   /**
    * @work:啟動(dòng)支付
    * @date:2015-9-7 上午11:49:51
    * @author:hg_liuzl@163.com
    */
   private void sendPayReq() {
       msgApi.registerApp(Constants.APP_ID);
       msgApi.sendReq(req);
   }

   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()).toUpperCase();
       return appSign;
   }

   private String genNonceStr() {
       Random random = new Random();
       return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
   }

   private long genTimeStamp() {
       return System.currentTimeMillis() / 1000;
   }

然后微信的操作如下:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
    
    /***微信支付結(jié)果*/
    public static int mWXPayResult = -1;

    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
    
    private IWXAPI api;
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay_result);
        
        api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);

        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {
    }

    @Override
    public void onResp(BaseResp resp) {

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            
            mWXPayResult = resp.errCode;
            
            if (resp.errCode == 0) //支付成功踱启,
            {   
                BToast.show(this, "支付成功!");
                finish();
            } else if(resp.errCode == -1) { //支付失敗
                BToast.show(this, "支付錯(cuò)誤");
                finish();
            }else if(resp.errCode == -2){//取消支付
                BToast.show(this, "您已經(jīng)取消了支付报账!");
                finish();
            }
        }
    }
}

這里我有一個(gè)全局靜態(tài)變量mWXPayResult來標(biāo)記微信支付是否成功的狀態(tài).

  mPayBean.payResult = WXPayEntryActivity.mWXPayResult == 0;
                if (mPayBean.payResult) {
                    doSubmit();
                } 

這個(gè)時(shí)候微信支付就處理完畢.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末研底,一起剝皮案震驚了整個(gè)濱河市埠偿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榜晦,老刑警劉巖冠蒋,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乾胶,居然都是意外死亡抖剿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門识窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斩郎,“玉大人,你說我怎么就攤上這事喻频∷跻耍” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵甥温,是天一觀的道長(zhǎng)锻煌。 經(jīng)常有香客問我,道長(zhǎng)姻蚓,這世上最難降的妖魔是什么宋梧? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮狰挡,結(jié)果婚禮上捂龄,老公的妹妹穿的比我還像新娘释涛。我一直安慰自己,他們只是感情好跺讯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布枢贿。 她就那樣靜靜地躺著,像睡著了一般刀脏。 火紅的嫁衣襯著肌膚如雪局荚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天愈污,我揣著相機(jī)與錄音耀态,去河邊找鬼。 笑死暂雹,一個(gè)胖子當(dāng)著我的面吹牛首装,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杭跪,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼仙逻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了涧尿?” 一聲冷哼從身側(cè)響起系奉,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姑廉,沒想到半個(gè)月后缺亮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桥言,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年萌踱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片号阿。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡并鸵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扔涧,到底是詐尸還是另有隱情园担,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布扰柠,位于F島的核電站粉铐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卤档。R本人自食惡果不足惜蝙泼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一汤踏、第九天 我趴在偏房一處隱蔽的房頂上張望搂擦。 院中可真熱鬧瀑踢,春花似錦、人聲如沸棘劣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撬陵。三九已至巨税,卻和暖如春驶兜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肆资。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工犯犁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人住诸。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓吼句,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驹愚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子远搪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、背景介紹 作為一名Android開發(fā)逢捺,從最初的跌跌撞撞到現(xiàn)在小有所悟谁鳍,這其中經(jīng)歷過的辛酸苦辣也是一種痛并快樂著...
    freecats08閱讀 4,822評(píng)論 7 54
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,743評(píng)論 25 707
  • 支付 1.支付寶和銀聯(lián)的支付流程 常用的支付方式有: 1、支付寶支付 https://openhome.alipa...
    丶逐漸閱讀 1,671評(píng)論 3 11
  • 《非銀行支付機(jī)構(gòu)網(wǎng)絡(luò)支付業(yè)務(wù)管理辦法》條款釋義 - 中國(guó)支付網(wǎng) - 中國(guó)支付行業(yè)第一門戶網(wǎng)站2016年7月1日...
    菜菜苔閱讀 7,524評(píng)論 1 44
  • 前幾天縣城的乳江河上游關(guān)了閘劫瞳,整條河河水干涸倘潜,很多人卷起褲角在河里摸螺,電魚志于。那天正好經(jīng)過涮因,遠(yuǎn)遠(yuǎn)望去,似乎電了好多...
    心向陽(yáng)無悲傷閱讀 537評(píng)論 5 6