Weixin.php 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace app\common\extend\pay;
  3. class Weixin {
  4. public $name = '微信支付';
  5. public $ver = '1.0';
  6. public function submit($user,$order,$param)
  7. {
  8. $total_fee = $order['order_price'];
  9. $data = array();
  10. $data['appid'] = trim($GLOBALS['config']['pay']['weixin']['appid']);//公众号
  11. $data['mch_id'] = trim($GLOBALS['config']['pay']['weixin']['mchid']);//商户号
  12. $data['nonce_str'] = mac_get_rndstr();//随机字符串
  13. $data['body'] = '积分充值(UID:'.$user['user_id'].')';//商品描述
  14. $data['fee_type'] = 'CNY';//标价币种
  15. $data['out_trade_no'] = $order['order_code'];//商户订单号
  16. $data['total_fee'] = $total_fee*100;//金额,单位分
  17. $data['spbill_create_ip'] = mac_get_client_ip();//终端IP
  18. $data['notify_url'] = $GLOBALS['http_type'] . $_SERVER['HTTP_HOST'] . '/index.php/payment/notify/pay_type/weixin';
  19. $data['trade_type'] = 'NATIVE';//交易类型 JSAPI,NATIVE,APP
  20. $data['product_id'] = '1';//商品ID
  21. //$data['openid'] = '';//用户标识 trade_type=JSAPI时(即公众号支付),此参数必传
  22. $data['sign'] = $this->makeSign($data);
  23. //获取付款二维码
  24. $data_xml = mac_array2xml($data);
  25. $res = mac_curl_post('https://api.mch.weixin.qq.com/pay/unifiedorder', $data_xml);
  26. $res = mac_xml2array($res);
  27. if($res['return_code']=='SUCCESS' && $res['result_code']=='SUCCESS'){
  28. //返回付款信息
  29. $res = [
  30. 'user_id'=>$user['user_id'],
  31. 'total_fee'=>$total_fee,
  32. 'out_trade_no'=>$data['out_trade_no'],
  33. 'code_url'=>$res['code_url']
  34. ];
  35. //echo '<img src=http://paysdk.weixin.qq.com/example/qrcode.php?data='.urlencode($res['code_url']).'/>';
  36. return $res;
  37. }
  38. //echo '获取微信二维码失败,'.$res['return_msg'];
  39. return false;
  40. }
  41. public function notify()
  42. {
  43. $xml = file_get_contents('php://input');
  44. $config = config('maccms.pay');
  45. //将服务器返回的XML数据转化为数组
  46. $data = mac_xml2array($xml);
  47. // 保存微信服务器返回的签名sign
  48. $data_sign = $data['sign'];
  49. // sign不参与签名算法
  50. unset($data['sign']);
  51. // 生成签名
  52. $sign = $this->makeSign($data);
  53. // 判断签名是否正确 判断支付状态
  54. if ( ($sign===$data_sign) && ($data['return_code']=='SUCCESS') && ($data['result_code']=='SUCCESS') ) {
  55. $res = model('Order')->notify($data['out_trade_no'],'weixin');
  56. echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
  57. }
  58. else{
  59. echo '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
  60. }
  61. }
  62. public function makeSign($data){
  63. //获取微信支付秘钥
  64. $key = trim($GLOBALS['config']['pay']['weixin']['appkey']);
  65. // 去空
  66. $data=array_filter($data);
  67. //签名步骤一:按字典序排序参数
  68. ksort($data);
  69. $string_a=http_build_query($data);
  70. $string_a=urldecode($string_a);
  71. //签名步骤二:在string后加入KEY
  72. $string_sign_temp=$string_a."&key=".$key;
  73. //签名步骤三:MD5加密
  74. $sign = md5($string_sign_temp);
  75. // 签名步骤四:所有字符转为大写
  76. $result=strtoupper($sign);
  77. return $result;
  78. }
  79. }