首页 » 网站建设 » php挪用会员刷卡技巧_微信刷卡支付API详解

php挪用会员刷卡技巧_微信刷卡支付API详解

访客 2024-12-17 0

扫一扫用手机浏览

文章目录 [+]

最近因项目须要微信支付,通过扫码抢扫描微信付款码,调用微信刷卡支付API完成扣费,过程中碰着了碰着了一些问题,填了很多坑,以是把自己的履历分享给大家,本篇文章先容如何利用刷卡支付API。

场景:

php挪用会员刷卡技巧_微信刷卡支付API详解

收银员利用扫码设备读取微信用户刷卡授权码往后,二维码或条码信息传送至商户收银台,由商户收银台或者商户后台调用该接口发起支付。
首先我们看一下微信官方供应的支付demo,链接:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1#

php挪用会员刷卡技巧_微信刷卡支付API详解
(图片来自网络侵删)

对付一些必选参数,纵然没什么用,也一定要传。

map.put(\"大众appid\"大众,\"大众你的"大众号appid\"大众);map.put(\公众mch_id\"大众, \公众微信支付商户号\"大众);map.put(\"大众sub_mch_id\"大众, \"大众微信支付分配的子商户号,做事商必填\公众);map.put(\"大众device_info\"大众, \"大众终端设备号\"大众));map.put(\"大众body\"大众, \公众商品名称\"大众);map.put(\"大众detail\"大众, \公众单品优惠功能字段\公众);map.put(\公众attach\公众,\公众附加数据\"大众);map.put(\"大众out_trade_no\"大众, \"大众订单号,哀求32个字符内\公众);map.put(\"大众total_fee\"大众,\"大众支付金额\公众));map.put(\"大众fee_type\"大众,\"大众默认公民币:CNY\公众);map.put(\"大众spbill_create_ip\"大众,InetAddress.getLocalHost().getHostAddress().toString());//获取调用支付接口的机器终端ipmap.put(\"大众goods_tag\"大众, \"大众\公众);map.put(\"大众limit_pay\"大众, \公众\"大众);map.put(\"大众time_start\"大众, \"大众\公众);map.put(\公众auth_code\"大众,\公众付款码\"大众 );map.put(\公众scene_info\"大众,\"大众\"大众);map.put(\"大众nonce_str\公众, \公众\"大众);sign = APIUtil.createSign(map, apikey, \公众utf-8\公众);logger.info(\"大众sign:\"大众+sign);map.put(\"大众sign\公众,sign);xml = APIUtil.buildXML(map);try { if(visitUrl!=\"大众\"大众||visitUrl!=null) { reStr= APIUtil.post(visitUrl, xml); System.out.println(\"大众reStr:\公众+reStr); if (reStr != null ) { xmlMap = APIUtil.reqMsg2Map(reStr); String reSign = APIUtil.createSign(xmlMap, apikey, \公众utf-8\"大众); logger.info(xmlMap.toString()); if (reSign.toLowerCase().equals(xmlMap.get(\"大众sign\公众).toString().toLowerCase())) { logger.info(\公众reSign\"大众, true); } } } logger.info(\"大众接口返回数据=\公众 + reStr);} catch (Exception e) { // TODO Auto-generated catch block logger.error(e.getMessage());}return xmlMap;

1.首先要明确微信支付是利用MD5进行署名的,这个是进行两次验签的,一次支付提高行验签,一次吸收微信返回数据后进行验签,目的是确保这是一次交易。
验签我们必须明确:

当然按ASCII排序直接一个TreeMap搞定(不熟习TreeMap的孩纸们自行查阅资料)。

2. 我们要知道你发过去的数据是个XML,以是必须用把你的参数布局成XML形式。

3. 返回给你的数据也是XML,以是你得转两次。

4. 发送数据了,你创造返回给你署名缺点,这时候从哪儿找问题呢?

(1)你的那些参数中有没有中文,有的话进行编码设置,可能你的数据已经乱码

(2)你的商户号和子商户号有没有写对(首先要明确一点,你是做事商还是特约客户,特约客户便是子商户,如果你是做事商,这两个参数你都该当有,如果没有请上岸商户平台进行查询)

(3) 你的密钥是否精确,加密的时候是拼接key的,以是确保你的key精确无误,如果不愿定key,可以上岸商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

(4)还有一种,这个便是我说的坑(话说微信的接口文档真叫一个烂),如果你确定你的密钥、商户号、子商户号、appid这些都精确的话,还报署名缺点,那么你可以去他们官方的署名校验工具(https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=20_1)考验下你的署名算法是否精确,如果打算出来的署名和你的署名算法算出来一样,那么恭喜你,踩坑了,重置你的密钥再试试(有可能会重置好几次哦,做好准备)。

(5) 如果很幸运,你成功调用了接口,这时候你高兴的递交了代码,静等测试给你反馈了,你以为没问题,很完美。
好了,梦醒了,连续测吧,bug很多:

① 你创造钱扣了,但是返回失落败,为什么呢?

明确一个很主要的点,return_code是通信表示,他返回成功知识解释你接口调通了,不能解释业务成功,业务成功看result_code。

② 你的用户有可能开通了免密支付,如果免密支付,那你这个代码很成功,no bug。
如果你的用户设置了非免密支付,那么bug来了。
这时候result_code也是FAIL,但是钱扣了,怎么办?如果你用debug调试,你会创造 err_code是USERPAYING,这就表明用户在输入密码,以是你得调查询订单接口,去查询订单,不要立即去查,每隔10秒。

如果这个时候result_code和rade_state都返回成功,这才表示用户支付成功了。

下来便是你根据自己的业务进行的一些操作,就不表述了,下来咋们看微信退款,支付是不须要证书的,但是退款须要双向证书。
你先要想一想你把证书放哪儿,两个建议,第一种放数据库(以二进制的形式存在BLOB类型),第二种放在resource里面单独建一个文件夹。

我因此第二种形式存放的。

但是记得在pom.xml中配置。

微信退款和支付传参、加密等一摸一样,就不多说了,我只说重点,怎么加载呢?明确一下,咋们是不须要解析证书的!
而且证书默认密码是你的商户号。

加载:

KeyStore keyStore = KeyStore.getInstance(\公众PKCS12\"大众);FileInputStream instream = new FileInputStream(new File(\公众文件目录\"大众));//P12文件目录try { keyStore.load(instream, \公众商户号\公众.toCharArray());//这里写密码..默认是你的MCHID} finally { instream.close();}SSLContext sslcontext = SSLContexts.custom() .loadKeyMaterial(keyStore, \"大众商户号\"大众.toCharArray())//这里也是写密码的 .build();// Allow TLSv1 protocol onlySSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, new String[] { \公众TLSv1\"大众 }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf) .build();

这样你创造,加载成功了,但是你还是没有调用成功,由于你没设置相应头信息,传过去是乱码!



相信我,你须要它,在你加载证书的工具类里把这些东西加上就完美了:

try { HttpPost httpost = new HttpPost(url); // 设置相应头信息 httpost.addHeader(\"大众Connection\"大众, \公众keep-alive\"大众); httpost.addHeader(\公众Accept\"大众, \"大众/\公众); httpost.addHeader(\公众Content-Type\公众, \"大众application/x-www-form-urlencoded; charset=UTF-8\公众); httpost.addHeader(\"大众Host\"大众, \"大众api.mch.weixin.qq.com\"大众); httpost.addHeader(\"大众X-Requested-With\"大众, \公众XMLHttpRequest\"大众); httpost.addHeader(\"大众Cache-Control\公众, \"大众max-age=0\公众); httpost.addHeader(\"大众User-Agent\公众, \"大众Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) \"大众); httpost.setEntity(new StringEntity(data, \公众UTF-8\"大众)); CloseableHttpResponse response = httpclient.execute(httpost); try { HttpEntity entity = response.getEntity(); String jsonStr = EntityUtils.toString(response.getEntity(), \"大众UTF-8\"大众); EntityUtils.consume(entity); return jsonStr; } finally { response.close(); }} finally { httpclient.close();}

这样微信支付就完了,建议不要用撤销接口,没必要。

关注微信公众年夜众号「Java大同盟」,关注即可获取海量学习干货,同时还有不定期送书,键盘,鼠标等粉丝福利。

赶紧来关注一波,海量资源拿得手软。

标签:

相关文章

php毛病传递技巧_PHP的缺点机制总结

首先须要理解php有哪些缺点。截至到php5.5,一共有16个缺点级别把稳:考试测验下面的代码的时候请确保打开error_log:...

网站建设 2024-12-18 阅读0 评论0