0.环境 下载 libammsdk.jar

1.需要的常量值

public class Constant {

    /** 微信中用到的常量值 */
public static final class WX_CONSTANT {
/** 微信支付 APP_ID */
public static final String APP_ID = "xxx";
/** 微信支付 商户号 */
public static final String MCH_ID = "xxx";
/** 微信支付 API密钥 */
public static final String API_KEY = "xxx";
}
}

2.package_name.wxapi 新建 WXPayEntryActivity.java (路径和文件名必须是这个)

package com.iotlife.action.wxapi;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View; import com.iotlife.action.R;
import com.iotlife.action.common.Constant;
import com.iotlife.action.util.LogUtil;
import com.iotlife.action.util.ThreadPoolUtil;
import com.iotlife.action.util.ToastUtil;
import com.iotlife.action.util.ViewUtil;
import com.iotlife.action.util.WXUtil;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory; public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
public static void start(Context context) {
context.startActivity(new Intent(context, WXPayEntryActivity.class));
} private IWXAPI api; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wechat_pay); api = WXAPIFactory.createWXAPI(this, Constant.WX_CONSTANT.APP_ID);
api.handleIntent(getIntent(), this); ViewUtil.$(this, R.id.btnPay).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ThreadPoolUtil.execute(new Runnable() {
@Override
public void run() {
WXUtil.submitOrder();
}
});
}
});
} @Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
} @Override
public void onReq(BaseReq req) {
} @Override
public void onResp(BaseResp resp) {
LogUtil.d("HttpUtil", "微信支付回调onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (resp.errCode == ) {
ToastUtil.show("支付成功");
} else {
ToastUtil.show("支付失败");
}
finish();
}
}
}

3.工具类 WXUtil.java

package com.iotlife.action.util;

import android.util.Xml;

import com.iotlife.action.application.EJYApplication;
import com.iotlife.action.common.Constant;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory; import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlPullParser; import java.io.IOException;
import java.io.StringReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID; import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; public class WXUtil {
private static final String TAG = "HttpUtil";
private static final IWXAPI msgApi = WXAPIFactory.createWXAPI(EJYApplication.getInstance(), null); /**
* 微信支付
* https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
* <p>
* https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
* 注释分别为:字段名称,是否必填
*/
public static void submitOrder() {
PayReq req = new PayReq();
req.nonceStr = StringUtil.md5(UUID.randomUUID().toString());
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
map.put("appid", Constant.WX_CONSTANT.APP_ID); // 应用ID
map.put("mch_id", Constant.WX_CONSTANT.MCH_ID);// 商户号
map.put("device_info", "WEB");// 设备号,否
map.put("nonce_str", req.nonceStr);// 随机字符串
// map.put("sign_type", "md5");// 签名类型,否
map.put("body", "body");// 商品描述
// map.put("detail", "detail");// 商品详情,否
map.put("attach", "attach");// 附加数据,否
map.put("out_trade_no", (System.currentTimeMillis() + 1415659990999L) + "");// 商户订单号
// map.put("fee_type", "CNY");// 货币类型,否
map.put("total_fee", "1");// 总金额,单位是分,不是元,不能有小数
map.put("spbill_create_ip", "14.23.150.211");// 终端IP
map.put("time_start", "");// 交易起始时间,否
map.put("time_expire", "");// 交易结束时间,否
map.put("goods_tag", "");// 订单优惠标记,否
map.put("notify_url", "https://www.baidu.com");// 通知地址
map.put("trade_type", "APP");// 交易类型
// map.put("limit_pay", "no_credit");// 指定支付方式,否 String key = Constant.WX_CONSTANT.API_KEY;
String sign = WXUtil.getSign(map, key);
map.put("sign", sign);
String entity = toXml(map);
LogUtil.d(TAG, entity);
byte[] buf = httpPost(entity);
String content = new String(buf);
LogUtil.d(TAG, "content " + content); Map<String, String> resultunifiedorder = decodeXml(content);
req.appId = map.get("appid");
req.partnerId = map.get("mch_id");
if (resultunifiedorder != null) {
req.prepayId = resultunifiedorder.get("prepay_id");
req.packageValue = "prepay_id=" + resultunifiedorder.get("prepay_id");
}
req.timeStamp = String.valueOf(System.currentTimeMillis() / 1000); List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp)); StringBuilder sb = new StringBuilder();
for (int i = 0; i < signParams.size(); i++) {
sb.append(signParams.get(i).getName());
sb.append('=');
sb.append(signParams.get(i).getValue());
sb.append('&');
}
sb.append("key=");
sb.append(Constant.WX_CONSTANT.API_KEY); req.sign = StringUtil.md5(sb.toString());
LogUtil.d(TAG, "req.sign = " + req.sign); msgApi.registerApp(Constant.WX_CONSTANT.APP_ID);
msgApi.sendReq(req);
} private static byte[] httpPost(String entity) {
final String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; HttpClient httpClient = getNewHttpClient();
HttpPost httpPost = new HttpPost(url);
try {
httpPost.setEntity(new StringEntity(entity));
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json"); HttpResponse resp = httpClient.execute(httpPost);
if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
LogUtil.d(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode());
return null;
} return EntityUtils.toByteArray(resp.getEntity());
} catch (Exception e) {
LogUtil.d(TAG, "httpPost exception, e = " + e.getMessage());
e.printStackTrace();
return null;
}
} private static HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null); SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443)); ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
} /**
* 微信公众平台支付接口调试工具
* https://pay.weixin.qq.com/wiki/tools/signverify/
*
* @param map
* @param key 商户Key
* @return
*/
private static String getSign(Map<String, String> map, String key) {
if (map == null || map.size() < 1) {
LogUtil.d("HttpUtil", "map 为空");
return "";
}
StringBuilder sb = new StringBuilder();
List list = new ArrayList<>(map.keySet());
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
if (map.get(list.get(i)) != null && !map.get(list.get(i)).equals("")) {
if (list.get(i).equals("notify_url")) {
sb.append(list.get(i)).append("=").append(map.get(list.get(i))).append("&");
} else {
sb.append(list.get(i)).append("=").append(StringUtil.encoder(map.get(list.get(i)))).append("&");
}
}
}
String stringA = sb.toString();
stringA = stringA.substring(0, stringA.length() - 1);
String stringSignTemp = stringA + "&key=" + key;
String sign = StringUtil.md5(stringSignTemp).toUpperCase();
LogUtil.d("HttpUtil", "stringA = " + stringA);
LogUtil.d("HttpUtil", "stringSignTemp = " + stringSignTemp);
LogUtil.d("HttpUtil", "sign = " + sign);
return sign;
} private static String toXml(Map<String, String> map) {
if (map == null || map.size() < 1) {
LogUtil.d("HttpUtil", "map 为空");
return "";
}
StringBuilder sb = new StringBuilder("<xml>");
for (String key : map.keySet()) {
if (map.get(key) != null && !map.get(key).equals("")) {
sb.append("<").append(key).append(">").append(map.get(key)).append("</").append(key).append(">");
}
}
return sb.append("</xml>").toString();
} private static class SSLSocketFactoryEx extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(truststore); TrustManager tm = new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() {
return null;
} @Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
} @Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
}; sslContext.init(null, new TrustManager[]{tm}, null);
} @Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
} @Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
} private static 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) {
xml.put(nodeName, parser.nextText());
}
break;
case XmlPullParser.END_TAG:
break;
}
event = parser.next();
}
return xml;
} catch (Exception e) {
LogUtil.d(TAG, "xml decoder error" + e.toString());
}
return null;
} }

android 项目集成 微信支付的更多相关文章

  1. Android 支付宝以及微信支付快速接入流程

    简介 随着移动支付的普及,越来越多的App采用第三发支付,在这里我们以支付宝为例,做一个快速集成! 一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:ht ...

  2. 手把手教你springboot集成微信支付

    20220727 最近要做一个微信小程序,需要微信支付,所以研究了下怎么在 java 上集成微信支付功能,特此记录下. 本文完整代码:点击跳转 准备工作 小程序开通微信支付 首先需要在微信支付的官网点 ...

  3. android app 集成 支付宝支付 微信支付

    项目中部分功能点需要用到支付功能,移动端主要集成支付宝支付和微信支付 支付宝sdk以及demo下载地址:https://doc.open.alipay.com/doc2/detail.htm?spm= ...

  4. 如何在Spring Boot项目中集成微信支付V3

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 演示例子: paym ...

  5. 关于ApiCloud的Superwebview在androidstudio中集成微信支付模块,提示模块未绑定的问题

    前两天ApiCloud项目集成了微信支付模块,android端今天也将ApiCloud官方的uzWxPay.jar集成了.在编译玩测试的时候提示wxPay模块为绑定!我的项目是使用ApiCloud推出 ...

  6. 解决新版Android studio导入微信支付和支付宝官方Demo的问题

    最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥.私钥和APPID等,所以就用下开放平台的呗. ...

  7. ***CodeIgniter集成微信支付(转)

    微信支付Native扫码支付模式二之CodeIgniter集成篇  http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...

  8. Android 高仿微信支付密码输入控件

    像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现这个功能. 老样子,投篮需要找准角度,变成需要理清思路.对于这个"小而美"的控件,我们思 ...

  9. iOS 集成微信支付【转载】

    目前项目里有微信支付的需求,调研过一段时间后,发现其实并没有想象中的那么困难.如果你只是想实现该功能,一个方法足以,但是若你想深入了解实现原理.就需要花费更多的功夫了.目前我只清楚微信支付需要做签名, ...

随机推荐

  1. oracle中的cursor

    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来 ...

  2. python 设计模式之享元(Flyweight)模式

    #写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...

  3. Mysql备份工具mysqldump和mysqlhotcopy

    (1).Mysql备份类型 1)按照备份时对数据库的影响分为 Hot backup(热备):也叫在线备份.指在数据库运行中直接备份,对正在运行的数据库没有任何影响. Cold backup(冷备):也 ...

  4. mysqlcheck修复工具

    mysqlcheck工具可以检查.修复.优化和分析MyISAM引擎的表,实际上是集成了Mysql中的check.repair.analyze.tmpimize的功能. mysqlcheck共军存在于m ...

  5. CRM-项目记录

    硬件篇 阵列R5 3个盘才能做R5阵列,还需要单独的一个SSD硬盘做系统盘 软件篇 跨域问题 SPRINGMVC 配置了跨域,也使用了跨域注解,但是依然不能解决问题 最后通过直接修改TOMCAT的WE ...

  6. dos下通过命令访问url网址

    psexec.exe工具: https://blog.csdn.net/feier7501/article/details/8841756 https://www.cnblogs.com/boltki ...

  7. WordPress简洁的SEO标题、关键词和描述

    WordPress标题.关键词和描述,之所以简洁,那是站在SEO的角度来考虑的. 首先,现在关键词这个标签早已被搜索引擎扔进历史的垃圾堆,所以这个keywords标签已经没用了,不写也罢. 其次,描述 ...

  8. QtCreator中打开.ui文件时卡死崩溃的解决方法

    问题 QtCreator中打开一个项目,在编辑器中打开普通的.cpp或.h等文件正常,构建正常,运行正常,但是打开ui文件(QtCreator自动调用designer)时会卡死然后崩溃退出. 解决方法 ...

  9. 最新 盛天网络java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.盛天网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了盛天网络.6.7月主要是做系统复习.项目复盘.Leet ...

  10. Redis List集合 使用

    列表类型(list)用于存储一个有序的字符串列表,常用的操作是向队列两端添加元素或者获得列表的某一片段.列表内部使用的是双向链表(double linked list)实现的,所以向列表两端添加元素的 ...