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. ubuntu12.04 64位安装opencv-2.4.9

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dengshuai_super/artic ...

  2. 复习Android布局

    效果如图: 这里没有做逻辑的处理,仅仅是布局的罗列.包括垂直和水平的线性布局,以及一个滚动的view. <?xml version="1.0" encoding=" ...

  3. Android插件化技术——原理篇

    <Android插件化技术——原理篇>     转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...

  4. Android向系统日历添加日程提醒事件

    在项目开发过程中,有时会有预约提醒.定时提醒等需求,这时我们可以使用系统日历来辅助提醒.通过向系统日历中写入事件.设置提醒方式(闹钟),实现到达某个特定的时间自动提醒的功能.这样做的好处是由于提醒功能 ...

  5. myeclipse打开jsp后卡死的问题详解

    myeclipse打开jsp后卡死的问题详解   1,打开 Window -> Preferences -> General -> Editors -> File Associ ...

  6. QML访问C++类内部

    0.前提 C++类需要继承QObject,且有Q_OBJECT宏[所以QT自己的那么多类按道理上QML都是可以直接访问的,nb] 1.QML访问C++中的非private槽函数 可直接调用 信号也是 ...

  7. 讲sql注入原理的 这篇不错(有空可以看看)

    我们围绕以下几个方面来看这个问题: 1.什么是sql注入? 2.为什么要sql注入? 3.怎样sql注入? 1.什么是sql注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或 ...

  8. 使用python3脚本部署mariadb主从架构

    环境准备 一个脚本自动部署master服务 另一个部署slave服务 关闭主从节点的防火墙 以及事先设置好root远程登陆的权限. master import paramikossh=paramiko ...

  9. 【用户体验】Google关闭标签的体验

    https://www.uisdc.com/hunter/0221334485.html 在优设-细节猎人里有不少好案例.

  10. laravel容器类make方法解释

    容器类调用make方法时,如果没有已注册的key,那么会自动通过反射类实例化具体类 make /** * Resolve the given type from the container. * * ...