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微信支付总结+自己搭建服务器的更多相关文章

  1. 转-Android微信支付

    http://blog.fangjie.info/android微信支付/ Android微信支付 2014-08-09 一.使用微信官方的提供的demo里的appid等 1.微信接口上手指南:(从“ ...

  2. 解决Android微信支付官方demo运行失败

    Android微信支付官方demo运行失败,在此简单记录一下解决步骤 1.httpclient错误 官方给的demo是eclipse的,打开之后提示httpclient的错误,我知道在as下解决htt ...

  3. Android微信支付V3版

    由于公司需求做微信APP支付,在集成过程中也遇到各种问题,比如说签名错误,body编码必须为UTF-8.APP端无法调用支付页面直接到支付结果页面.结果为null,code=-1等等: 1.签名错误问 ...

  4. Android 微信支付步骤

    以前自己写过微信支付,今天让我用h5调用微信支付,结果还浪费了点时间,虽然时间不长. 1.导入jar包 .微信提供的jar包 2.写你的微信支付的代码,其实如果参数都有了就一段代码: public v ...

  5. Android 微信支付&支付宝支付

    由于项目需求,加入这2个功能记录一些需要注意的地方 一.微信支付 微信支付在2016年4月份左右稍微调整了一下支付过程,但是文档却没怎么更新,这也是百度上为什么那么多开发者都说微信是个大坑. 身为一个 ...

  6. Android微信支付SDK开发笔记

    一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...

  7. Android 微信支付资料收集

    老板要求支持微信支付,收集了些资料做后期参考 http://www.360doc.com/content/15/0214/10/7044580_448519997.shtml http://www.t ...

  8. Android微信支付SDK开发

    一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...

  9. Android微信支付SDK

    App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微 ...

随机推荐

  1. nodejs如何储存一个GBK编码的文件

    思路:utf-8 -> decode(to buffer) -> convert to gbk(buffer also) -> write buffer to file. var f ...

  2. 掌握Thinkphp3.2.0----自动验证

    自动验证是TP在create数据的时候,自动对数据进行验证. TP提供了两种验证方式:静态验证($_validate属性----自定义的模型的)和validate()方法 1.静态验证-----$_v ...

  3. Vanishing point detection

    https://marcosnietoblog.wordpress.com/code/

  4. laravel5.1学习(1)--安装

    主要学习的是laravel5.1版本,服务器用的是wampserver3.0.4集成环境: 首先,安装composer(windows系统) 下载地址:https://getcomposer.org/ ...

  5. SLP测试记录

    个人感觉来说这个游戏对我没有什么吸引力...完全不知道用户需求在哪...是我最不喜欢的一个游戏 不过听制作团队之前的介绍,这应该不算是一个游戏,而是一个游戏练习器?所以从游戏的角度来评判的话感觉有很多 ...

  6. python基础:交互式解释器

    什么是"交互式python解释器"? 当你看到">>>"符号,就意味着你进入交互式python解释器,又称作"提示符". ...

  7. Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理

    摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■  详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...

  8. Android 偶遇小问题解决方案集合

    1.Android 如何让EditText不自动获取焦点 解决方案:找一个EditText的父级控件把EditText默认的行为截断了!设置 android:focusable="true& ...

  9. Linux编译源码的方式安装Qt4开发环境(基于Ubuntu系统)

    1.到官网http://qt-project.org/downloads或者ftp://ftp.qt-project.org/上下载Qt的源码包,要安装当然要先有源码咯,我下载的是qt-everywh ...

  10. Javascript-9-1-OOP-5-链式调用

    <html lang="en"> <head> </head> <body> <div class="" ...