好了,终于要进行正题了.我们来进行实现的支付动作.刷卡支付,即用户打开微信->我->钱包->刷卡.会显示如下界面.商家使用扫描设备读取条形码或二维码,其实就是读取最顶上的那一串字符串.这个界面,每分钟自动刷新新的字符串.如图:
扫码支付,只需将特定的xml消息,post到微信服务器: https://api.mch.weixin.qq.com/pay/micropay..如下:
<xml>
<sign><![CDATA[E283A17BFFDE291CB86945B9534E3F0C]]></sign>
<body><![CDATA[微微花语-花束]]></body>
<mch_id>1391091002</mch_id>
<spbill_create_ip><![CDATA[127.0.0.1]]></spbill_create_ip>
<total_fee>10</total_fee>
<auth_code>130511591103617845</auth_code>
<appid><![CDATA[wxfedef3857580f5a0]]></appid>
<out_trade_no><![CDATA[h80j32aw0zsvw256tfsjj4jmfyd6xrbh]]></out_trade_no>
<nonce_str><![CDATA[86qlwk7iyq5egk4la2pahuwuglvgz2b0]]></nonce_str>
</xml>
sign字段即为签名字段,签名算法见官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_3
其他字段,见官方文档...
调用这个api会返回xml消息.例如:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxfedef3857580f5a0]]></appid>
<mch_id><![CDATA[1391091002]]></mch_id>
<nonce_str><![CDATA[86qlwk7iyq5egk4la2pahuwuglvgz2b0]]></nonce_str>
<sign><![CDATA[0DA97530CE3C7F5AD0F501042AD5D695]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<openid><![CDATA[oeXrjw-JM3GPjBRTPKUM8DOTAQ5A]]></openid>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<trade_type><![CDATA[MICROPAY]]></trade_type>
<bank_type><![CDATA[CMB_DEBIT]]></bank_type>
<total_fee>10</total_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<transaction_id><![CDATA[4005682001201703224272564945]]></transaction_id>
<out_trade_no><![CDATA[h80j32aw0zsvw256tfsjj4jmfyd6xrbh]]></out_trade_no>
<attach></attach>
<time_end><![CDATA[20170322182020]]></time_end>
<cash_fee>10</cash_fee>
<cash_fee_type><![CDATA[CNY]]></cash_fee_type>
</xml>
需要注意的是,这个api是即时返回的,而当用户当天多次(多于5笔)刷卡之后,微信要求用户输入密码.但是,这个api却是马上返回如下xml的:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxfedef3857580f5a0]]></appid>
<mch_id><![CDATA[1391091002]]></mch_id>
<nonce_str><![CDATA[AwIezlvfb055LwLO]]></nonce_str>
<sign><![CDATA[EB43AF0272D48978F9DF681E935BD347]]></sign>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[USERPAYING]]></err_code>
<err_code_des><![CDATA[需要用户输入支付密码]]></err_code_des>
</xml>
这个困扰了我蛮久,不知道微信在大神是如何考滤的,还想着是不是因为http协议的原因,不能让请求卡在那里,一直等一直等,而不返回.后面想想,确实是有道理的,万一用户不输入密码了呢?难道死等下去?
所以api的返回值,并不是正确的,官方文档里也说明,需要商户去轮询调用查询订单接口,获得真正的结果.但是,像扫码支付,公众号支付,都是可以配置notify_url的,微信会向这个url回调支付结果,一开始我也在想,为什么刷卡支付就不使用这种notify_url处理方式了呢?也许是因为考滤,刷卡支付可以实现在硬件上吧,例如,扫码枪.可以省掉一个服务器,如果店家只把刷卡硬件当收费工具,而不需要对这些账单折腾到服务器上时.