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
- android微信支付开发
- Android 微信支付开发
- Android微信支付开发
- Android微信支付开发
- Android开发之微信支付,支付宝支付
- Android开发之微信支付功能
- Android微信支付客户端开发概要
- android微信支付开发过程
- 终结《android开发集成微信支付》
- Android之微信支付宝开发
- android微信支付开发流程
- Android微信支付集成开发
- Android支付开发(微信)
- android微信支付开发过程
- android开发之微信支付
- Android开发之----微信支付
- Android开发 接入微信支付 案例
- Android微信支付开发流程
- 数学归纳法证明任意两个正整数相等(伪命题)
- jdk1.7 环境配置
- Poj 2887 Big String(块状数组)
- 问题三十五: 怎么用ray tracing画二次曲面(quadratic surfaces)(4)——双曲抛物面(马鞍面)
- HDU-1698-Just A Hook (线段树区间修改,区间查询)
- Android微信支付开发
- 3D射线拾取算法揭秘
- NDK编程的一个坑—Arm平台下的类型转换
- leetcode oj java 143. Reorder List
- 四个月的蜕变之单例模式创建线程池和使用
- 《Head First设计模式》-工厂模式C++实现
- python 2-5 如何快速找到多个字典中的(key) viewkeys(集合)/reduce(lambda a,b:a&b,map(d.keys(),[d1,d2])
- zoj2314
- mysql5.7 修改默认密码