Android微信支付SDK開發,android支付sdk

來源:互聯網
上載者:User

Android支付SDK開發,android支付sdk

一、準備工作

1、開發平台及SDK下載

開放平台

https://open.weixin.qq.com

下載SDK

支付Demo下載

http://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1

 

2、建立應用

建立行動裝置 App擷取 AppID  AppSecret

要擷取支付功能還需要開發人員資質認證,300RMB/年的費用,貌似是開放平台中唯一要收費的…

 

3、AndroidMainfest檔案修改

許可權

<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"/>

  

二、商務程序

商戶系統和支付系統主要互動說明:

步驟1:使用者在商戶APP中選擇商品,提交訂單,選擇支付。

步驟2:商戶後台收到使用者支付單,調用支付統一下單介面。參見【統一下單API】。

步驟3:統一下單介面返回正常的prepay_id,再按簽名規範重建簽名後,將資料轉送給APP。參與簽名的欄位名為appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式為Sign=WXPay

步驟4:商戶APP調起支付。api參見本章節【app端開發步驟說明】

步驟5:商戶後台接收支付通知。api參見【支付結果通知API】

步驟6:商戶後台查詢支付結果。,api參見【查詢訂單API】

 

三、開發

1、註冊應用

final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);msgApi.registerApp(Constants.APP_ID);

  

2、調用支付統一下單介面,並返回PrepayID

private class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String,String>> {         private ProgressDialog dialog;         @Override        protected void onPreExecute() {            dialog = ProgressDialog.show(PayActivity.this, getString(R.string.app_tip), getString(R.string.getting_prepayid));        }         @Override        protected void onPostExecute(Map<String,String> result) {            if (dialog != null) {                dialog.dismiss();            }            sb.append("prepay_id\n"+result.get("prepay_id")+"\n\n");            show.setText(sb.toString());            resultunifiedorder=result;        }         @Override        protected void onCancelled() {            super.onCancelled();        }         @Override        protected Map<String,String>  doInBackground(Void... params) {            String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");            String entity = genProductArgs();            Log.e("orion",entity);            byte[] buf = Util.httpPost(url, entity);            String content = new String(buf);            Log.e("orion", content);            Map<String,String> xml=decodeXml(content);            return xml;        }    }
設定統一下單參數:
private String genProductArgs() {        StringBuffer xml = new StringBuffer();        try {            String  nonceStr = genNonceStr();            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", "http://121.40.35.3/test"));            packageParams.add(new BasicNameValuePair("out_trade_no",genOutTradNo()));            packageParams.add(new BasicNameValuePair("spbill_create_ip","127.0.0.1"));            packageParams.add(new BasicNameValuePair("total_fee", "1"));            packageParams.add(new BasicNameValuePair("trade_type", "APP"));            String sign = genPackageSign(packageParams);            packageParams.add(new BasicNameValuePair("sign", sign));           String xmlstring =toXml(packageParams);            return xmlstring;        } catch (Exception e) {            Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());            return null;        }      }

  

3、設定PayReq請求的參數,並發送支付請求

//設定PayReq請求的參數private void genPayReq() {        req.appId = Constants.APP_ID;        req.partnerId = Constants.MCH_ID;        req.prepayId = resultunifiedorder.get("prepay_id");        req.packageValue = "prepay_id="+resultunifiedorder.get("prepay_id");        req.nonceStr = genNonceStr();        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");        show.setText(sb.toString());        Log.e("orion", signParams.toString());     }

 

//發送請求msgApi.sendReq(req);

 

4、處理結果回調

實現API的IWXAPIEventHandler介面

api.handleIntent(getIntent(), new IWXAPIEventHandler);

在IWXAPIEventHandler的onResp(BaseResp resp)中處理請求回調

@Override    public void onResp(BaseResp resp) {        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);         if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {                    //處理PayReq的回調        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setTitle(R.string.app_tip);        builder.setMessage(getString(R.string.pay_result_callback_msg, resp.errStr +";code=" + String.valueOf(resp.errCode)));        builder.show();    }}

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.