微信支付类
来源:互联网 发布:搬瓦工搭建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
- 微信支付类
- 微信支付类
- 微信支付类 demo
- 微信支付工具类
- 微信支付工具类
- 微信、支付宝支付
- 支付宝,微信支付
- 微信支付【支付模式】
- 微信支付Jsapi支付
- 微信支付-刷卡支付
- 微信支付JSAPI支付
- 微信支付 h5 支付
- 支付--微信APP支付
- 微信支付:手机支付
- 支付宝 微信支付
- 支付宝-微信支付
- 微信支付与支付宝支付
- 支付宝支付与微信支付
- Android分析View的scrollBy()和scrollTo()的参数正负问题原理分析
- 修改SDP 读取SDP
- Swift基础语法2
- 高斯模糊
- LUA freeswitch 常用小结
- 微信支付类
- html页<!--[if IE]>...<![endif]-->使用解说
- hbase导入导出数据
- C++多态实现原理
- Java笔记(4)-线程、Thread、Runable、开子线程、线程运行状态、线程同步、线程死锁
- 面试题40:数组中只出现一次的数字
- linux系统中通过页面插入的数据出现乱码,修改mysql数据库编码
- Kinect V2 开发专题(1)软硬件需求与安装测试
- window7下配置下载android源码环境,安装Repo