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. C# 控制datagridview的combox属性的列绑定数据

    //datagridvie列绑定list的数据 List<User> listChange = GetChange();//查询数据库内容,保存到list this.datagridvie ...

  2. [转]10个有关RESTful API良好设计的最佳实践

    Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GE ...

  3. Scala的模式匹配

    1.概述 2.程序示例(普通的示例) 3.模式匹配(Array) 4.程序示例(Array) 5.模式匹配(List) 6.程序示例 7.遍历 8.模式匹配(case class) 9.程序示例(传统 ...

  4. C++ 在Windows下截取整个屏幕 和 指定句柄窗口的屏幕

    #include <windows.h> #include <stdint.h> #include <stdio.h> void ShootScreen(const ...

  5. JavaScript:编程改变文本样式

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" Content=&q ...

  6. django--主要部分

    django URL  URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个U ...

  7. wordpress多站点环境设置上传附件大小

    多站点环境更改上传附件大小: php.ini post_max_size = 8M upload_max_filesize = 10M 另外,后台域名管理中设置/网络设置/可以设置上传文件大小. 代码 ...

  8. 简单理解call_user_func和call_user_func_array两个函数

    call_user_func():调用一个回调函数处理字符串, 可以用匿名函数,可以用有名函数,可以传递类的方法, 用有名函数时,只需传函数的名称 用类的方法时,要传类的名称和方法名 传递的第一个参数 ...

  9. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  10. js 四舍五入

    举例excel: ROUND 会四舍五入的:ROUNDDOWN 取小数点后两位数据,不管进位问题:ROUNDUP 取小数点后两位数据,只要有第三位小数都会进位的.关键看你取数的要求   在js如果要求 ...