深度解析PHP、JAVA如何实现微信支付服务端接口

来源:互联网 发布:邮箱域名大全 编辑:程序博客网 时间:2024/06/03 16:42

今天朋友问我如何实现php的微信支付服务端。想着大家对支付这块可能不太了解。特别发一篇文章帮助大家理清楚关系。很多人发现 为什么我照着微信官方文档做的为什么还是支付不成功或收不到微信的通知。那是以为微信的文档很久没更新了。


在讲支付前希望大家明白 微信公众支付 和 微信APP支付 的不同。公众账号支付 需要 授权域名。切记。


1.把大象装冰箱总共分几步?

答案很明显三步。

1.统一下单获取预支付ID

2.根据预支付ID进行MD5数据签名,签名主要用户APP或者公众号支付。

3.微信返回支付成功回调 进行订单更新。


2.微信统一下单

文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

下单后微信会返回xml字符串 使用file_get_contents函数拿到xml

<xml>   <return_code><![CDATA[SUCCESS]]></return_code>   <return_msg><![CDATA[OK]]></return_msg>   <appid><![CDATA[wx2421b1c4370ec43b]]></appid>   <mch_id><![CDATA[10000100]]></mch_id>   <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>   <openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid>   <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>   <result_code><![CDATA[SUCCESS]]></result_code>   <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>   <trade_type><![CDATA[JSAPI]]></trade_type></xml>

使用php解析xml判断return_code  return_msg等值的状态如果为OK。则表示下单成功。拿出prepay_id用作签名。


3.微信签名

说起签名之前,大家一定要明白的几个变量的意思。

APP_ID 微信为每个申请支付的应用创建的ID

APP_SECRET 对应的密匙。

WEIXIN_NOTIFY 微信通知地址。

PARTNER 财付通账号

PARTNER_KEY 财付通对应Key


签名前没有设置Key的朋友自己去公众平台或微信支付平台设置。这里不再详述。


签名需要哪些参数?有什么用?

签名需要用户将你购买的商品的价格,数量,单价,名称等信息 以字典序排序后  拼上key生成的。

微信文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3

最终数据就是这样

<xml><appid>wxd930ea5d5a258f4f</appid><mch_id>10000100</mch_id><device_info>1000<device_info><body>test</body><nonce_str>ibuaiVcKdpRxkhJA</nonce_str><sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign></xml>
4.异步回调更新订单

异步回调主要用于订单的状态更新。支付时间,支付金额,库存减少等。

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。微信通知信息为xml格式。

格式如下:

<xml><appid><![CDATA[wx65498522b9a7pokr]]></appid><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[1]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[N]]></is_subscribe><mch_id><![CDATA[1238752902]]></mch_id><nonce_str><![CDATA[103v4ohia9x8zcmpgted7mhln96d7ouy]]></nonce_str><openid><![CDATA[o1FbXsuU0L3PhQaR0FH6eAwLMDc0]]></openid><out_trade_no><![CDATA[2222]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[DF81D51082E2039B5EC7E6C3B47461F2]]></sign><time_end><![CDATA[20161228092403]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[NATIVE]]></trade_type><transaction_id><![CDATA[4005212001201612284235706302]]></transaction_id></xml>
由于微信的回调是采用的输入流。但是官网的文档是没有更新的。大家注意,

php需要这样获取XML数据

$xmlData = file_get_contents('php://input');
解析方法如下
libxml_disable_entity_loader(true);$data = json_decode(json_encode(simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
做签名验证,防止黑客提交假数据。刚刚提交订单时。我们使用了签名 现在我们就来验证签名。
ksort($data);$buff = '';foreach ($data as $k => $v){    if($k != 'sign'){        $buff .= $k . '=' . $v . '&';    }}$stringSignTemp = $buff . 'key=192006250b4c09247ec02edce69f6a2d';//key为证书密钥$sign = strtoupper(md5($stringSignTemp));//判断算出的签名和通知信息的签名是否一致if($sign == $data['sign']){    //处理完成之后,告诉微信成功结果    echo '<xml>              <return_code><![CDATA[SUCCESS]]></return_code>              <return_msg><![CDATA[OK]]></return_msg>          </xml>';    exit();}
记住:签名正确后 根据微信返回的其他信息。判断支付金额是否是与数据库对应的。是否是合法的。是否已经购买过。等等操作。

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7


好了。今天的教程就到这。

原创粉丝点击