android端微信支付的builder

来源:互联网 发布:2016旅行软件比例 编辑:程序博客网 时间:2024/06/07 12:11
<pre name="code" class="java">mPaymentBuilder.doPay();

public class PaymentBuilder {private Activity mActivity;private IWXAPI mMsgApi;private PayReq mPayReq;private Map<String, String> resultunifiedorder;private int mFeePrice;private String mTransactionNumber,mOrderDescription;private String mNotifyUrl;private String mAppId,mAppKey,mMchId;public PaymentBuilder(Activity activity) {mActivity = activity;mMsgApi = WXAPIFactory.createWXAPI(activity, null);resultunifiedorder = new HashMap<String, String>();}public PaymentBuilder registerPrice(int feePrice){mFeePrice = feePrice;return this;}public PaymentBuilder registerTransactionNumber(String transactionNumber){mTransactionNumber = transactionNumber;return this;}public PaymentBuilder registerNotifyUrl(String notifyUrl){mNotifyUrl = notifyUrl;return this;}public PaymentBuilder registerAppInfo(String appId,String appKey,String mchId){mAppId = appId;mAppKey = appKey;mMchId = mchId;return this;}public PaymentBuilder registerOrderDescription(String orderDescription){mOrderDescription = orderDescription;return this;}public void build(){mPayReq = new PayReq();GetPrepayIdTask getPrepayIdTask = new GetPrepayIdTask();getPrepayIdTask.execute();}public void doPay(){mMsgApi.registerApp(mAppId);mMsgApi.sendReq(mPayReq);}private long genTimeStamp() {return System.currentTimeMillis() / 1000;}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", mAppId));packageParams.add(new BasicNameValuePair("body", mOrderDescription));packageParams.add(new BasicNameValuePair("mch_id", mMchId));packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));packageParams.add(new BasicNameValuePair("notify_url",mNotifyUrl));packageParams.add(new BasicNameValuePair("out_trade_no",mTransactionNumber));packageParams.add(new BasicNameValuePair("spbill_create_ip",getIp()));packageParams.add(new BasicNameValuePair("total_fee", mFeePrice+""));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) {return null;}}private void genPayReq() {mPayReq.appId = mAppId;mPayReq.partnerId = mMchId;mPayReq.prepayId = resultunifiedorder.get("prepay_id");mPayReq.packageValue = "prepay_id="+ resultunifiedorder.get("prepay_id");mPayReq.nonceStr = genNonceStr();mPayReq.timeStamp = String.valueOf(genTimeStamp());List<NameValuePair> signParams = new LinkedList<NameValuePair>();signParams.add(new BasicNameValuePair("appid", mPayReq.appId));signParams.add(new BasicNameValuePair("noncestr", mPayReq.nonceStr));signParams.add(new BasicNameValuePair("package", mPayReq.packageValue));signParams.add(new BasicNameValuePair("partnerid", mPayReq.partnerId));signParams.add(new BasicNameValuePair("prepayid", mPayReq.prepayId));signParams.add(new BasicNameValuePair("timestamp", mPayReq.timeStamp));mPayReq.sign = genAppSign(signParams);}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.API_KEY);String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();Log.e("orion", 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(Constants.API_KEY);String appSign = MD5.getMessageDigest(sb.toString().getBytes());Log.e("orion", appSign);return appSign;}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());return sb.toString();}private 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) {xml.put(nodeName, parser.nextText());}break;case XmlPullParser.END_TAG:break;}event = parser.next();}return xml;} catch (Exception e) {Log.e("orion", e.toString());}return null;}private String getIp(){return "127.0.0.1";}private static String genNonceStr() {Random random = new Random();return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());}private class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String,String>> {private ProgressDialog dialog;@Overrideprotected void onPreExecute() {dialog = ProgressDialog.show(mActivity, "加载中", "正在生成...");}@Overrideprotected void onPostExecute(Map<String,String> result) {if (dialog != null) {dialog.dismiss();}resultunifiedorder=result;genPayReq();}@Overrideprotected void onCancelled() {super.onCancelled();}@Overrideprotected Map<String,String> doInBackground(Void... params) {String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");String entity = genProductArgs();byte[] buf = Utils.httpPost(url, entity);String content = new String(buf);Map<String,String> xml=decodeXml(content);return xml;}}


使用方法:

首先,绘制一个页面,用来加载预支付,在页面oncreate里面实现代码:

mPaymentBuilder.registerAppInfo(Constants.APP_ID, Constants.API_KEY, Constants.MCH_ID).registerNotifyUrl("http://ncp.jiandaobaoapp.com").registerOrderDescription("农村电商").registerPrice(1).registerTransactionNumber(StringHelper.getGUIDString()).build();


然后 当点击支付的时候,调用



0 0