android微信支付总结+自己搭建服务器
1.前期注册操作
1-1:微信开发平台:https://open.weixin.qq.com/
1-2:创建移动应用
签名获取:
1.将自己的apk签名打包,运行到手机上。
2.将微信支付的签名工具,运行到手机上。
3.通过签名工具,获取签名。
2.android端初始化
2-1:签名配置
signingConfigs {
debug{
storeFile file("f:/style.keystore")
storePassword "13873129725"
keyAlias "style"
keyPassword "13873129725"
}
release {
storeFile file("f:/style.keystore")
storePassword "13873129725"
keyAlias "style"
keyPassword "13873129725"
}
}
2-2:权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2-3:支付按钮
<Button
android:id="@+id/appay_btn"
android:background="@drawable/btn_style_one"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#fff"
android:textSize="20sp"
android:text="开始支付" />
按钮点击样式:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/btn_style_one_pressed" />
<item android:drawable="@drawable/btn_style_one_normal" />
</selector>
2-4:导入jar包
2-5:调用微信支付的代码
Button appayBtn;
private IWXAPI api;
api = WXAPIFactory.createWXAPI(this, Constant.OPEN_ID);
appayBtn = (Button) findViewById(R.id.appay_btn);
appayBtn.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// String url = "http://139.196.196.64:8080/PayServer/mypay.jsp";
String name = null;
try {
name = URLEncoder.encode("你好","utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String url = "http://172.16.46.114:8080/Pay/pay.jsp?goodsName="+name+"&price=11";
Toast.makeText(MainActivity.this, "获取订单中...", Toast.LENGTH_SHORT).show();
HttpUtil.get(url, new HttpUtil.CallBack() {
@Override
public void onSuccess(String content) {
try {
Log.e("get server pay params:", content);
if (content != null) {
JSONObject json = new JSONObject(content);
if (null != json && !json.has("retcode")) {
PayReq req = new PayReq();
req.appId = json.getString("appid");
req.partnerId = json.getString("partnerid");
req.prepayId = json.getString("prepayid");
req.nonceStr = json.getString("noncestr");
req.timeStamp = json.getString("timestamp");
req.packageValue = json.getString("package");
req.sign = json.getString("sign");
req.extData = "app data"; // optional
Toast.makeText(MainActivity.this, "正常调起支付", Toast.LENGTH_SHORT).show();
api.sendReq(req);
} else {
Log.d("PAY_GET", "返回错误" + json.getString("retmsg"));
Toast.makeText(MainActivity.this, "返回错误" + json.getString("retmsg"), Toast.LENGTH_SHORT).show();
}
} else {
Log.d("PAY_GET", "服务器请求错误");
Toast.makeText(MainActivity.this, "服务器请求错误", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Log.e("PAY_GET", "异常:" + e.getMessage());
Toast.makeText(MainActivity.this, "异常:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
appayBtn.setEnabled(true);
} @Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this, "网络连接失败", Toast.LENGTH_SHORT).show();
appayBtn.setEnabled(true);
}
});
}
});
3.微信支付服务器搭建
3-1:jsp页面
<%
//得到输入的商品名称和价格
String goodsName = request.getParameter("goodsName");
String price = request.getParameter("price"); if (goodsName == null || goodsName.trim().equals("")) {
out.print("商品名不能为空");
}
if (price == null || price.trim().equals("")) {
out.print("商品价格不能为空");
}
int goodsPrice = Integer.parseInt(price); //把相关参数传给微信支付
TreeMap<String, Object> map = new TreeMap<String, Object>();
map.put("appid", Constant.OPEN_ID);
map.put("mch_id", Constant.SW_ID);
map.put("nonce_str", Utils.getRandomStr());
map.put("body", goodsName);
map.put("out_trade_no", Utils.getRandomStr());
map.put("total_fee", goodsPrice);
map.put("spbill_create_ip", request.getLocalAddr());
map.put("notify_url",
"http://139.196.196.64:8080/PayServer/mypay.jsp");
map.put("trade_type", "APP");
map.put("sign", Utils.getSignStr(map)); //把map转换成xml,并发送到微信支付接口
String info = Utils.map2xml(map);
String i = getHttpData.sendMsg(Constant.ORDER, info); //接收它的返回信息
Map<String, Object> returnMap = Utils.xml2Map(i);
//返回的键要相对应,所以要改过来
TreeMap<String, Object> resultmap = new TreeMap<String, Object>();
resultmap.put("appid", Constant.OPEN_ID);
resultmap.put("partnerid", Constant.SW_ID);
resultmap.put("prepayid",returnMap.get("prepay_id"));
resultmap.put("noncestr",returnMap.get("nonce_str"));
resultmap.put("timestamp",Utils.getDataStr("yyyyMMddHH"));
resultmap.put("package","WXPay");
resultmap.put("sign",Utils.getSignStr(resultmap)); String inf = JSON.toJSONString(resultmap);
out.print(inf);
%>
3-2:常用方法 Utils.java
package com.firefly.common;
import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Utils {
// 得到32位随机数
public static String getRandomStr() {
StringBuffer sb = new StringBuffer();
Random r = new Random();
String str = "QWERTYUIOPASDFGHJKLZXCVBNM0123456789";
for (int i = 0; i < 32; i++) {
sb.append(str.charAt(r.nextInt(str.length())));
}
return sb.toString();
}
// 得到sign
public static String getSignStr(TreeMap<String, Object> map) {
String info = "";
Set<String> keySet = map.keySet();
for (String string : keySet) {
info += string + "=" + map.get(string) + "&";
}
info += "key=" + Constant.API_KEY;
return MD5.MD5Encode(info).toUpperCase();
}
// 得到日期
public static String getDataStr(String type) {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat(type);
return format.format(date);
}
// 转换为xml
public static String map2xml(TreeMap<String, Object> map) {
String info = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
info += "<xml>";
Set<String> keySet = map.keySet();
for (String string : keySet) {
info += "<" + string + ">" + map.get(string) + "</" + string + ">";
}
info += "</xml>";
return info;
}
public static Map<String, Object> xml2Map(String xmlStr) {
Map<String, Object> map = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 将字符串转换成流
ByteArrayInputStream bis = new ByteArrayInputStream(xmlStr
.getBytes());
Document doc = builder.parse(bis);
Node root = doc.getFirstChild();// 根节点
NodeList nodeList = root.getChildNodes();
map = new HashMap<String, Object>();
for (int i = 0; i < nodeList.getLength(); i++) {
Node child = nodeList.item(i);
if (child instanceof Element) {
Element e = (Element) child;
map.put(e.getNodeName(), e.getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
// 测试
public static void main(String[] args) {
// System.out.println("随机:"+Utils.getRandomStr());
TreeMap<String, Object> ma = new TreeMap<String, Object>();
ma.put("appid", "wefoi");
ma.put("eei", "20934jf");
System.out.println(Utils.map2xml(ma));
// System.out.println(getDataStr("yyyyMMddHH"));
}
}
android微信支付总结+自己搭建服务器的更多相关文章
- 转-Android微信支付
http://blog.fangjie.info/android微信支付/ Android微信支付 2014-08-09 一.使用微信官方的提供的demo里的appid等 1.微信接口上手指南:(从“ ...
- 解决Android微信支付官方demo运行失败
Android微信支付官方demo运行失败,在此简单记录一下解决步骤 1.httpclient错误 官方给的demo是eclipse的,打开之后提示httpclient的错误,我知道在as下解决htt ...
- Android微信支付V3版
由于公司需求做微信APP支付,在集成过程中也遇到各种问题,比如说签名错误,body编码必须为UTF-8.APP端无法调用支付页面直接到支付结果页面.结果为null,code=-1等等: 1.签名错误问 ...
- Android 微信支付步骤
以前自己写过微信支付,今天让我用h5调用微信支付,结果还浪费了点时间,虽然时间不长. 1.导入jar包 .微信提供的jar包 2.写你的微信支付的代码,其实如果参数都有了就一段代码: public v ...
- Android 微信支付&支付宝支付
由于项目需求,加入这2个功能记录一些需要注意的地方 一.微信支付 微信支付在2016年4月份左右稍微调整了一下支付过程,但是文档却没怎么更新,这也是百度上为什么那么多开发者都说微信是个大坑. 身为一个 ...
- Android微信支付SDK开发笔记
一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...
- Android 微信支付资料收集
老板要求支持微信支付,收集了些资料做后期参考 http://www.360doc.com/content/15/0214/10/7044580_448519997.shtml http://www.t ...
- Android微信支付SDK开发
一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...
- Android微信支付SDK
App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微 ...
随机推荐
- 20145220&20145209&20145309信息安全系统设计基础实验报告(3)
20145220&20145209&20145309信息安全系统设计基础实验报告(3) 实验报告链接: http://www.cnblogs.com/zym0728/p/6132243 ...
- [转]你不需要jQuery
完全没有否定jQuery的意思,jQuery是一个神奇的.非常有用的工具,可以节省我们大量的时间. 但是,有些时候,我们只需要jQuery的一个小功能,来完成一个小任务,完全没有必要加载整个jQuer ...
- javaScript的简单学习
JavaScript介绍 JavaScript跟java没半毛钱关系 JavaScript有三部分组成:ECMAScript,document object model,broswer object ...
- Quartz 入门详解
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
- express 的 app.get和app.use
1.若调用app.get()时只有一个参数,则认为是取设置值,否则认为是注册路由 2.所有被 app.use() 接收的 handle 会被放到一个 stack 里边 app.get() 执行的时候会 ...
- AutoBundle in asp.net mvc 5
using System.Collections.Concurrent; using System.Text; namespace System.Web.Optimization { public s ...
- leetcode 397
题目描述: Given a positive integer n and you can do operations as follow: If n is even, replace n with n ...
- 【C#进阶】override new virtual
class Organ { public virtual void Intro() { Console.WriteLine("I'm a organ."); } public st ...
- UML基本介绍
用例图: 概念:描述用户需求,从用户的角度描述系统的功能,是用户拨通观察到的系统功能的模型图,用例是系统中的一个功能单元. 实现:椭圆表示某个用例:人形符号表示角色. 目的:帮助开发团队以一种可视化的 ...
- JVM内存结构---《深入理解Java虚拟机》学习总结
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域的用途各不相同,同时也依据着各自的执行规则,独立的创建和销毁数据. 虚拟机内存的划分,如图所示: 线程之间 ...