Android微信支付开发

来源:互联网 发布:编程电极怎么编 编辑:程序博客网 时间:2024/05/20 20:47

Android微信支付开发步骤

我的项目里有不同业务参杂在一起,所以就把支付宝和微信都写在了微信的回调类(WXPayEntryActivity)里了,按我的步骤,走下来就可以集成支付完整的功能。


1、首先要在微信官方申请企业帐号并提交认证材料,认证成功会得到应用APP_ID,商户号MCH_ID,API密钥,然后下载官方最新的demo
2、构造支付参数PayInfo

                    PayInfo info = new PayInfo();                    info.setBody(String);                    info.setNotifyUrl(String);                    info.setSubject(String);                    info.setPrice(double); // 最多小数点2为 再多了会失败                    info.setNotifyIp("125.35.5.103");                    info.setAttach(String);//                    info.setOrderNo(String);                                      //判断如果安装微信客户端了再吊起支付                    if (isWXAppInstalledAndSupported() == false) {                        showToast("请您确认是否安装了微信客户端");                        return;                    }                 GetPrepayIdTask getPrepayId = new GetPrepayIdTask();                    getPrepayId.execute();
/**     * 微信支付准备     * @Package com.weixin.paydemo     * @Description: TODO     * @author wang     * @date 2016-3-10 下午3:11:19     * @version V1.0     */    private class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String,String>> {        @Override        protected void onPreExecute() {            //加载进度对话框            mLoadingDialog = new CustomLoadingDialog(WXPayEntryActivity.mContext,true);            mLoadingDialog.show();        }        @Override        protected void onPostExecute(Map<String,String> result) {            if(result!=null){                //生成支付参数                genPayReq(result.get("prepay_id"));                // 吊起支付                sendPayReq();            }else{                showToast("微信调起支付失败,请您重试");                if (mLoadingDialog!=null)                    mLoadingDialog.dismiss();            }        }        @Override        protected void onCancelled() {            super.onCancelled();        }        @Override        protected Map<String,String>  doInBackground(Void... params) {            api.registerApp(ConstantKeys.WxPay.APP_ID);            String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");//把支付参数传给微信官方            String entity = genProductArgs();            L.e(LOG_TAG,entity);            byte[] buf = Util.httpPost(url, entity);            String content = new String(buf);            L.e(LOG_TAG, content);            Map<String,String> xml=decodeXml(content);            return xml;        }    }
把支付参数封装成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", ConstantKeys.WxPay.APP_ID));            if(info.getAttach()!=null)            packageParams.add(new BasicNameValuePair("attach",info.getAttach()));            packageParams.add(new BasicNameValuePair("body", info.getBody()));            packageParams.add(new BasicNameValuePair("mch_id", ConstantKeys.WxPay.MCH_ID));            packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));            packageParams.add(new BasicNameValuePair("notify_url", info.getNotifyUrl()));            packageParams.add(new BasicNameValuePair("out_trade_no",info.getOrderNo()));            packageParams.add(new BasicNameValuePair("spbill_create_ip",info.getNotifyIp()));            String price = String.valueOf((int)(Float.parseFloat(info.getPrice())*100));            packageParams.add(new BasicNameValuePair("total_fee",price));            packageParams.add(new BasicNameValuePair("trade_type", "APP"));            String sign = genPackageSign(packageParams);            packageParams.add(new BasicNameValuePair("sign", sign));            String xmlstring = toXml(packageParams);            lcLog("----------paramstring-->"+new String(xmlstring.toString().getBytes(), "ISO8859-1"));            return new String(xmlstring.toString().getBytes(), "ISO8859-1");        } catch (Exception e) {            lcLog("--------------e-->"+e.toString());            L.e("xx", "genProductArgs fail, ex = " + e.getMessage());            return null;        }    }
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) {            L.e(LOG_TAG,e.toString());        }        return null;    }    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>");        L.e(LOG_TAG,sb.toString());        return sb.toString();    }private String genNonceStr() {        Random random = new Random();        return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());    }

/**
生成签名
*/

private String genPackageSign(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(ConstantKeys.WxPay.API_KEY);    String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();    L.e(LOG_TAG,packageSign);    return packageSign;}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(ConstantKeys.WxPay.API_KEY);    String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();    L.e(LOG_TAG,appSign);    return appSign;}

为了安全考虑,微信支付参数请求切记一定要写在服务器端,还有需要注意的是不要开启硬件加速功能,否则会影响传参,也有可能会调不起来微信支付.有微信支付或者支付宝支付相关问题可以加我QQ915816029微信同号。

0 0
原创粉丝点击