@Service
public class WeixinPayServiceImpl implements WeixinPayService {
@Value("
a
p
p
i
d
"
)
p
r
i
v
a
t
e
S
t
r
i
n
g
a
p
p
i
d
;
/
/
微
信
公
众
账
号
或
开
放
平
台
A
P
P
的
唯
一
标
识
@
V
a
l
u
e
(
"
{appid}") private String appid; //微信公众账号或开放平台 APP 的唯一标识 @Value("
appid")privateStringappid;//微信公众账号或开放平台APP的唯一标识@Value("{partner}")
private String partner;//财付通平台的商户账号
@Value("
p
a
r
t
n
e
r
k
e
y
"
)
p
r
i
v
a
t
e
S
t
r
i
n
g
p
a
r
t
n
e
r
k
e
y
;
/
/
财
付
通
平
台
的
商
户
密
钥
@
V
a
l
u
e
(
"
{partnerkey}") private String partnerkey;//财付通平台的商户密钥 @Value("
partnerkey")privateStringpartnerkey;//财付通平台的商户密钥@Value("{notifyurl}")
private String notifyurl;//回调地址,没实际用处,下面可以写死
/*
WXPayUtil.generateNonceStr()
(2)MAP 转换为 XML 字符串(自动添加签名)
WXPayUtil.generateSignedXml(param, partnerkey)
(3)XML 字符串转换为 MAP
WXPayUtil.xmlToMap(result)
*/
@Override
public Map createNative(String out_trade_no, String total_fee) {
//1:封装参数,具体要看发的文件里面的统一下单,请求参数是必填项目,就需要封装
HashMap param = new HashMap();//
param.put("appid", appid);//公众账号id
param.put("mch_id", partner);//商户号
param.put("nonce_str", WXPayUtil.generateNonceStr());// 随机字符串 pom里面传过来的微信的sdk
// param.put("sign", "");//签名 每次都不一样,跟随机字符串有关
param.put("body", "品优购");//商品描述 可以随便写,就是付款的时候显示的
param.put("out_trade_no", out_trade_no);//商户订单号
param.put("total_fee", total_fee);//标价金额
param.put("spbill_create_ip", "127.0.0.1");//终端ip 没有实际意思,只需要按照规格写一个就行
param.put("notify_url", "http://test.itcast.cn");//回调地址随便写
param.put("trade_type", "NATIVE");//交易类型(native原生支付)
try {
String xmlParam = WXPayUtil.generateSignedXml(param, partnerkey);//根据param生成一个带签名的xml
System.out.println("请求的参数是"+xmlParam);
//2:发送请求
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");//微信支付的url
client.setHttps(true);//是否是 https 协议
client.setXmlParam(xmlParam);//发送的 xml 数据
client.post();//执行 post 请求
//3:获取结果
String xmlResult = client.getContent(); //获取xml结果
Map<String, String> stringMap = WXPayUtil.xmlToMap(xmlParam);//返回的结果,里面包含了很多东西,我们需要的就是三个,所以就再次封装一下
System.out.println("微信返回的结果是"+stringMap);
HashMap hashMap = new HashMap();
hashMap.put("code_url", stringMap.get("code_url"));//支付地址
hashMap.put("out_trade_no", out_trade_no);//订单号
hashMap.put("total_fee", total_fee);//总金额
return hashMap;
} catch (Exception e) {
e.printStackTrace();
return new HashMap();
}
}
}