Android微信支付开发

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微信同号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值