扫码⽀付完整实现⽰例
扫码⽀付完整实现⽰例
阅读⽂档
在线⽀付开发⽂档:
⽀付接⼝调⽤过程
按API要求组装参数,以XML⽅式发送(POST)给⽀付接⼝(URL),⽀付接⼝也是以XML⽅式给予响应。程序根据返回的结果(其中包括⽀付URL)⽣成⼆维码或判断订单状态。
核⼼参数
appid:公众账号或开放平台APP的唯⼀标识
mch_id:商户号 (配置⽂件中的partner)
partnerkey:商户密钥
sign:数字签名, 根据官⽅提供的密钥和⼀套算法⽣成的⼀个加密信息, 就是为了保证交易的安全性
准备SDK
SDK核⼼常⽤⽅法:
获取随机字符串
MAP转换为XML字符串(⾃动添加签名)
XML字符串转换为MAP
下载SDK天在下雨我在想你
安装SDK到本地仓库
扫码⽀付快速开始
引⼊SDK
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>3.0.9</version>
</dependency>
创建WxConfig类
创建PayConfig 类 ,继承抽象类WXPayConfig。
public abstract class WXPayConfig {
/**
* 获取 App ID
*
* @return App ID
*/
abstract String getAppID();
/**
* 获取 Mch ID
*
* @return Mch ID
*/
abstract String getMchID();
/
**
* 获取 API 密钥
*
* @return API密钥
*/
abstract String getKey();
/**
* 获取商户证书内容
*
* @return 商户证书内容
*/
abstract InputStream getCertStream();
//........
}
需要注意:
WXPayConfig是抽象类,且WXPayConfig的抽象⽅法默认使⽤的修饰符是default,default修饰符在其他包内是没有访问权限的,所以继承WXPayconfig抽象类实现抽象⽅法时需注意包结构。
解决⽅案
1.修改官⽅wxpay-sdk源码,将抽象⽅法的修饰符从默认修改为public,然后重新打包到本地或者私服。
想做网络推广2.使⽤时注意包结构与官⽅wxpay-sdk源码包结构⼀致即可。
public class PayConfig extends WXPayConfig {
/**
皇帝谥号* 获取 App ID
*
* @return
*/
@Override
String getAppID(){
return"appId";
}
/**
* 商户号
*
* @return
*/
@Override
String getMchID(){
return"machId";
}
/**
* 获取 API 密钥
*
* @return
*/
@Override
敏而好学 不耻下问的意思String getKey(){
return"key";
}
/**
* 获取商户证书内容
*
* @return
*/
@Override
沉香如屑电视剧结局InputStream getCertStream(){
return null;
}
/**
* 获取WXPayDomain, ⽤于多域名容灾⾃动切换
*
* @return
*/
@Override
IWXPayDomain getWXPayDomain(){
return new IWXPayDomain(){
@Override
public void report(String s,long l, Exception e){
}
@Override
public DomainInfo getDomain(WXPayConfig wxPayConfig){
//API接⼝地址的前半部分,如统⼀下单API接⼝地址:h.weixin.qq/pay/unifiedorder return new DomainInfo("h.weixin.qq",true);
}
};
}
}
统⼀下单
@Test
void createNative()throws Exception {
PayConfig config =new PayConfig();
//封装请求参数
Map<String,String> map=new HashMap();
map.put("appid",AppID());//公众账号ID
map.put("mch_id",MchID());//商户号
map.put("nonce_str", ateNonceStr());//随机字符串
map.put("body","腾讯充值中⼼-QQ会员充值");//商品描述
map.put("out_trade_no","2016090910595900001234");//订单号
map.put("total_fee","100");//⾦额,单位分
map.put("spbill_create_ip","127.0.0.1");//终端IP
map.put("notify_url","www.baidu");//回调地址
map.put("trade_type","NATIVE");//此处指定为扫码⽀付
//添加签名
String toXmlParams = ateSignedXml(map, Key());
//xml格式的参数
System.out.println("XML参数:"+toXmlParams);
恢复回收站删除文件工具//发送请求
WXPayRequest wxPayRequest=new WXPayRequest(config);
//统⼀下单API接⼝地址:h.weixin.qq/pay/unifiedorder后半截
String xmlResult = questWithCert("/pay/unifiedorder",null, toXmlParams,false); System.out.println("请求结果:"+xmlResult);
//解析返回结果
Map<String, String> mapResult = lToMap(xmlResult);
String code_url = ("code_url");
System.out.println("解析取值:"+code_url);
}
XML参数:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xml>
<nonce_str>GlTPbFnwzznWamng5iv9IrzWvAnnD3cx</nonce_str>
<out_trade_no>2016090910595900001234</out_trade_no>
<appid>appid</appid>
<total_fee>100</total_fee>
<sign>4066AE6B9BD7D4814041FD7B74D75AC5</sign>
<trade_type>NATIVE</trade_type>
<mch_id>mch_id</mch_id>
<body>腾讯充值中⼼-QQ会员充值</body>
<notify_url>www.baidu</notify_url>
<spbill_create_ip>127.0.0.1</spbill_create_ip>
</xml>
请求结果:
<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[appid]]></appid>
<mch_id><![CDATA[mch_id]]></mch_id>
<nonce_str><![CDATA[MP4VAsQgBnAPT031]]></nonce_str>
<sign><![CDATA[560F D6149A30645A5156ABC3248DB1E7]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx18225930904975e36a86b5d28729c90000]]></prepay_id>
<trade_type><![CDATA[NATIVE]]></trade_type>
<code_url><![CDATA[weixin://wxpay/bizpayurl?pr=hGzJAG7zz]]></code_url>
</xml>
发布评论