公司最近要搞微信支付, 之前也没有做过, 但是搞过阿里云, 想来也不是很难. 在网上找了很多贴子, 在eclipse里做了5个测试工程, 没有测试成功, 后来下了微信SDK, 也做了个测试样例, 期间参考了: https://blog.csdn.net/t_james/article/details/84653827#comments
第一步, 下SDK, https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
第二步, 准备 公众号appid, 商业号(MchID), key, 参考: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=3_1 获得,
这个是需要公司去注册与申请的,
第三步, 开通支付模式, 这里要是扫码支付(Native支付), 支付模式介绍见: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=2_1
第四步, 把工程导入eclipse, 完整如下图:
以下是完整代码, 搞多了大家不理解, 就一个类:
package com.github.wxpay.test;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.github.wxpay.sdk.WxPayConfigImpl;
/**
* 签名验证工具地址:
* https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1
*
* 统一下单API说明:
* https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
* @author 123
*
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//unifiedOrder();
orderQuery();
}
/**
* 统一下单接口<br>
* 场景:公共号支付、扫码支付、APP支付
*/
public static void unifiedOrder (){
try {
//sdk类引用
WxPayConfigImpl config = WxPayConfigImpl.getInstance();
WXPay pyPay = new WXPay(config);
//订单号 (调整为自己的生产逻辑)
String out_trade_no = config.getMchID()+"-" + System.currentTimeMillis();
//公众号appid
String appid = config.getAppID();
//商业号
String mch_id = config.getMchID();
//key
String key = config.getKey();
//随机数
String nonce_str = WXPayUtil.generateNonceStr();
//获取发起电脑 ip,可以用百度之类的代替来测试
String spbill_create_ip = "123.123.123.123";
//回调接口(反正本机测试时不用,随意搞一个能访问的)
String notify_url = "http://www.weixin.qq.com/wxpay/pay.php";
//模式
String trade_type = "NATIVE";//"JSAPI";
SortedMap<String,String> packageParams = new TreeMap<String,String>();
packageParams.put("appid", appid);
packageParams.put("mch_id", mch_id);
packageParams.put("nonce_str", nonce_str);
packageParams.put("body", "test-coke"); //(调整为自己的名称)格式: 腾讯充值中心-QQ会员充值
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("total_fee", "10"); //价格的单位为分
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("notify_url", notify_url);
packageParams.put("trade_type", trade_type);
Map runMap = pyPay.unifiedOrder(packageParams);
System.out.println("=============returnXml==============");
System.out.println(runMap.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//发送:
// <?xml version="1.0" encoding="UTF-8" standalone="no"?>
// <xml>
// <appid>公众号APPID</appid>
// <body>test-coke</body>
// <mch_id>自己的商户号</mch_id>
// <nonce_str>rE8iTtCENf4VSOtOCZ0PIbkuuNklyFpw</nonce_str>
// <notify_url>http://www.weixin.qq.com/wxpay/pay.php</notify_url>
// <out_trade_no>自己的商户号-1561942616146</out_trade_no>
// <sign>907192B0875A02F199B45B7F30356644751DF6D4A2AFA77C0F3C226E4A60D276</sign>
// <sign_type>HMAC-SHA256</sign_type>
// <spbill_create_ip>123.123.123.123</spbill_create_ip>
// <total_fee>10</total_fee>
// <trade_type>NATIVE</trade_type>
// </xml>
//结果:
// <xml><return_code><![CDATA[SUCCESS]]></return_code>
// <return_msg><![CDATA[OK]]></return_msg>
// <appid><![CDATA[公众号APPID]]></appid>
// <mch_id><![CDATA[自己的商户号]]></mch_id>
// <nonce_str><![CDATA[ayhkOwhZysjBQNR6]]></nonce_str>
// <sign><![CDATA[021F45467BA5119C389D5F08D768CC5A635687057BBD6445E6B7A1BBB34F4AA9]]></sign>
// <result_code><![CDATA[SUCCESS]]></result_code>
// <prepay_id><![CDATA[wx010855154971807287de77f31587946700]]></prepay_id>
// <trade_type><![CDATA[NATIVE]]></trade_type>
// <code_url><![CDATA[weixin://wxpay/bizpayurl?pr=kMwACCs]]></code_url>
// </xml>
//解释后内容
//{nonce_str=ayhkOwhZysjBQNR6, code_url=weixin://wxpay/bizpayurl?pr=kMwACCs, appid=公众号APPID, sign=021F45467BA5119C389D5F08D768CC5A635687057BBD6445E6B7A1BBB34F4AA9, trade_type=NATIVE, return_msg=OK, result_code=SUCCESS, mch_id=自己的商户号, return_code=SUCCESS, prepay_id=wx010855154971807287de77f31587946700}
}
/**
* 查询订单接口<br>
* 场景:刷卡支付、公共号支付、扫码支付、APP支付
*/
public static void orderQuery(){
try {
//sdk类引用
WxPayConfigImpl config = WxPayConfigImpl.getInstance();
WXPay pyPay = new WXPay(config);
//订单号
String out_trade_no = "自己的商户号-1561942616146";
//appid
String appid = config.getAppID();
//商业号
String mch_id = config.getMchID();
//随机数
String nonce_str = WXPayUtil.generateNonceStr();
//模式
String trade_type = "NATIVE";//"JSAPI";
SortedMap<String,String> packageParams = new TreeMap<String,String>();
packageParams.put("appid", appid);
packageParams.put("mch_id", mch_id);
packageParams.put("nonce_str", nonce_str);
packageParams.put("out_trade_no", out_trade_no);
Map runMap = pyPay.orderQuery(packageParams);
System.out.println("=============returnXml==============");
System.out.println(runMap.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//发送
// <?xml version="1.0" encoding="UTF-8" standalone="no"?>
// <xml>
// <appid>公众号APPID</appid>
// <mch_id>自己的商户号</mch_id>
// <nonce_str>epQ1ZECqQryQJv0ZOybGc8XIjWTJupNX</nonce_str>
// <out_trade_no>自己的商户号-1561942616146</out_trade_no>
// <sign>366964520A9209243A714EAB55D46E542B56152E705814D4DB20FF1567511DA9</sign>
// <sign_type>HMAC-SHA256</sign_type>
// </xml>
//结果:
// <xml><return_code><![CDATA[SUCCESS]]></return_code>
// <return_msg><![CDATA[OK]]></return_msg>
// <appid><![CDATA[公众号APPID]]></appid>
// <mch_id><![CDATA[自己的商户号]]></mch_id>
// <device_info><![CDATA[]]></device_info>
// <nonce_str><![CDATA[dewGq9USU04gFwUE]]></nonce_str>
// <sign><![CDATA[94D3B1BFB852E19CB3F421DBC23D5A3AE5A7CBDC9448C8B146959036141EFE2F]]></sign>
// <result_code><![CDATA[SUCCESS]]></result_code>
// <total_fee>10</total_fee>
// <out_trade_no><![CDATA[自己的商户号-1561942616146]]></out_trade_no>
// <trade_state><![CDATA[NOTPAY]]></trade_state>
// <trade_state_desc><![CDATA[订单未支付]]></trade_state_desc>
// </xml>
}
}
注: WxPayConfigImpl, WXPayDomainSimpleImpl 实现 参考这位兄弟的微博
https://blog.csdn.net/t_james/article/details/84653827#comments
代码里的 [公众号APPID], [商户号], [key], [发起电脑 ip] 这几个换成自己公司的或自己客户的相关内容
统一下单接口说明: 调用代码成功收到微信的回复, 这个测试是微信返回一个二维码连接 code_url, 拿到 code_url内容之后, 自己可以用google二维码工具显示到jsp页面上, 然后用手机扫描支付. 只要后台代码能与微信交互, 有没有页面都不重要.
订单查询接口: 这样列子中下单之后, 自己的代码要每隔2-3秒查询一次微信, 看看订单是不是支付成功了, 成功了说明客户支付了.
整个流程如下: 调用[统一下单接口] -->把某个订单, 某个商品下单----> 调用成功收到微信的 code_url ------> 自己用二维码工具生成二维码 ------> 客户扫描二维码 ------> 每隔几秒调用[订单查询接口] -------> 支付成功则完成交易.