微信支付类

来源:互联网 发布:搬瓦工搭建ss优化提速 编辑:程序博客网 时间:2024/06/06 22:17
package app.baf.com.boaifei;import android.app.ProgressDialog;import android.content.Context;import android.os.AsyncTask;import android.util.Log;import android.util.Xml;import android.widget.Toast;import com.tencent.mm.sdk.modelpay.PayReq;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.WXAPIFactory;import org.apache.http.NameValuePair;import org.apache.http.message.BasicNameValuePair;import org.xmlpull.v1.XmlPullParser;import java.io.StringReader;import java.io.UnsupportedEncodingException;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Random;import app.baf.com.boaifei.utils.MD5;import app.baf.com.boaifei.utils.Tools;import app.baf.com.boaifei.utils.Util;/** * Created by ltf on 2016/7/14. */public class Pay {    private static final String TAG = ".PayActivity";    private Context context;    private IWXAPI api;    private String signStr;    private String out_trade_no_str;//订单ID    private String nonceStr;    private String weixinBody = "支付";    private String trade_type = "APP";    private String backTrade;    private String backMoney;    private String paytype;    public static Pay intance = null;    /**     * @param context   组件     * @param backTrade 订单编号     * @param backMoney 返回钱     * @param paytype   支付模式(自测)     */    public Pay(Context context, String backTrade, String backMoney, String paytype) {        this.context = context;        this.backTrade = backTrade;        this.backMoney = backMoney;        this.paytype = paytype;        api = WXAPIFactory.createWXAPI(context, Constants.APP_ID);        intance = this;    }    public void prePayID() {        GetPrepayIdTask getPrepayId = new GetPrepayIdTask();        getPrepayId.execute();    }    private class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String, String>> {        private ProgressDialog dialog;        @Override        protected void onPreExecute() {            dialog = ProgressDialog.show(context, context.getString(R.string.app_tip), context.getString(R.string.getting_prepayid));        }        @Override        protected void onPostExecute(Map<String, String> result) {            if (dialog != null) {                dialog.dismiss();            }            if (result.get("return_code").equals("SUCCESS")) {                Toast.makeText(context, "开启支付成功", Toast.LENGTH_SHORT).show();            } else {                Toast.makeText(context, "开启支付失败", Toast.LENGTH_SHORT).show();            }        }        @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();            byte[] buf = Util.httpPost(url, entity);            String content = new String(buf);            Log.e("orion", content);            Map<String, String> xml = decodeXml(content);            String sign = xml.get("sign");            String return_code = xml.get("return_code");            String trade_type = xml.get("trade_type");            String result_code = xml.get("result_code");            String appid = xml.get("appid");            String mch_id = xml.get("mch_id");            String nonce_str = xml.get("nonce_str");            String prepay_id = xml.get("prepay_id");            String return_msg = xml.get("return_msg");            String err_code_des = xml.get("err_code_des");            String err_code = xml.get("err_code");            if (return_code.equals("SUCCESS")) {                PayReq request = new PayReq();                request.appId = appid;                request.partnerId = mch_id;                request.prepayId = prepay_id;                request.packageValue = "Sign=WXPay";                request.nonceStr = nonce_str;                request.timeStamp = String.valueOf(genTimeStamp());                List<NameValuePair> signParams = new LinkedList<NameValuePair>();                signParams.add(new BasicNameValuePair("appid", request.appId));                signParams.add(new BasicNameValuePair("noncestr", request.nonceStr));                /**                 * 这里的package参数值必须是Sign=WXPay,否则IOS端调不起微信支付,                 * (参数值是"prepay_id="+resultunifiedorder.get("prepay_id")的时候Android可以,IOS不可以)                 */                signParams.add(new BasicNameValuePair("package", request.packageValue));                /**注意二次签名这里不再是mch_id,变成了prepayid;*/                signParams.add(new BasicNameValuePair("partnerid", request.partnerId));                signParams.add(new BasicNameValuePair("prepayid", request.prepayId));                signParams.add(new BasicNameValuePair("timestamp", request.timeStamp));                request.sign = genPackageSign(signParams);                request.extData = "app data"; // optional                api.registerApp(Constants.APP_ID);                api.sendReq(request);            }            return xml;        }    }    private String genProductArgs() {        StringBuffer xml = new StringBuffer();        try {            genNonceStr();            genOutTradNo(backTrade);            xml.append("</xml>");            List<NameValuePair> packageParams = new LinkedList<NameValuePair>();            packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));            packageParams.add(new BasicNameValuePair("body", weixinBody));            packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));            packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));            packageParams.add(new BasicNameValuePair("notify_url", "http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php"));            packageParams.add(new BasicNameValuePair("out_trade_no", out_trade_no_str));            packageParams.add(new BasicNameValuePair("spbill_create_ip", getAddIP()));            packageParams.add(new BasicNameValuePair("total_fee", backMoney));            packageParams.add(new BasicNameValuePair("trade_type", trade_type));            genPackageSign(packageParams);            packageParams.add(new BasicNameValuePair("sign", signStr));            String xmlstring = toXml(packageParams);            return xmlstring;        } catch (Exception e) {            return null;        }    }    private String getAddIP() {        String str = Tools.getLocalIpAddress(context);        Log.i("IP", str);        return str;    }    private String genNonceStr() {        Random random = new Random();        nonceStr = MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());        return nonceStr;    }    private long genTimeStamp() {        long time = System.currentTimeMillis() / 1000;        Log.i("time", time + "  ......");        return time;    }    private String genOutTradNo(String str) {//        Random random = new Random();//        out_trade_no_str = MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());//        return out_trade_no_str;        out_trade_no_str = str;//                = MD5.getMessageDigest(String.valueOf(str).getBytes());//        Log.i("MD5 dingdan:", out_trade_no_str);        return out_trade_no_str;    }    /**     * 生成签名     */    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(Constants.KEY);        String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();        signStr = packageSign;        return packageSign;    }    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("orion", sb.toString());        try {            return new String(sb.toString().getBytes(), "ISO8859-1");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        return                "";    }    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());//                            Log.i("nodeName;" + nodeName, parser.nextText());                        }                        break;                    case XmlPullParser.END_TAG:                        break;                }                event = parser.next();            }            return xml;        } catch (Exception e) {            Log.e("error ", e.toString());        }        return null;    }    public String getPaytype() {        return paytype;    }    public void setPaytype(String paytype) {        this.paytype = paytype;    }}
0 0
原创粉丝点击