jspay.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 2017/6/1
  6. * Time: 下午9:54
  7. */
  8. namespace Pay;
  9. define(JSPAY_PATHEX, BASE_DATA_PATH . '/api/pub_wxpay');
  10. require_once(JSPAY_PATHEX . '/lib/WxPay.Api.php');
  11. require_once(JSPAY_PATHEX . '/lib/WxPay.Config.php');
  12. require_once(JSPAY_PATHEX . '/lib/WxPay.Data.php');
  13. require_once(JSPAY_PATHEX . '/lib/WxPay.Exception.php');
  14. require_once(JSPAY_PATHEX . '/lib/WxPay.Notify.php');
  15. use \WxPayUnifiedOrder;
  16. use \WxPayApi;
  17. use \Log;
  18. use \WxPayConfig;
  19. class jspay implements IPay
  20. {
  21. const wx_notifyurl = BASE_SITE_URL . '/mobile/pub_wxnotify.php';
  22. const wx_orderquery = 'https://api.mch.weixin.qq.com/pay/orderquery';
  23. public function gen_pay($pay_sn,$fee,$order_sn,$subject)
  24. {
  25. $input = new WxPayUnifiedOrder();
  26. $input->SetBody($subject); //商品或支付单简要描述
  27. $input->SetAttach($pay_sn); //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
  28. $out_trade_no = $pay_sn . sprintf("%03d",mt_rand(0,999)); //给微信用的每次重新生成的商户订单SN, 避免二次支付, 数额修改导致支付失败
  29. $input->SetOut_trade_no($out_trade_no);//商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
  30. $input->SetTotal_fee("{$fee}");//订单总金额,单位为分,详见支付金额
  31. $input->SetTime_start(date("YmdHis")); //订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
  32. $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
  33. $input->SetNotify_url(self::wx_notifyurl);
  34. $input->SetTrade_type("JSAPI");
  35. $input->SetOpenid('oUcoEwPenKPpHenLKCtZhRDVUdgU');
  36. $order = WxPayApi::unifiedOrder($input);
  37. if(!array_key_exists("appid", $order)
  38. || !array_key_exists("prepay_id", $order)
  39. || $order['prepay_id'] == "")
  40. {
  41. throw new WxPayException("参数错误");
  42. }
  43. $jsapi = new WxPayJsApiPay();
  44. $jsapi->SetAppid($order["appid"]);
  45. $timeStamp = time();
  46. $jsapi->SetTimeStamp("$timeStamp");
  47. $jsapi->SetNonceStr(WxPayApi::getNonceStr());
  48. $jsapi->SetPackage("prepay_id=" . $order['prepay_id']);
  49. $jsapi->SetSignType("MD5");
  50. $jsapi->SetPaySign($jsapi->MakeSign());
  51. // $parameters = json_encode($jsapi->GetValues());
  52. // return $parameters;
  53. //
  54. //
  55. // $sorder = $this->toString($order);
  56. // Log::record($sorder, Log::DEBUG);
  57. //
  58. // if (array_key_exists('err_code', $order)) {
  59. // return false;
  60. // }
  61. //
  62. // $ret['appid'] = $order["appid"];
  63. // $ret['noncestr'] = WxPayApi::getNonceStr();
  64. // $ret['package'] = 'Sign=WXPay';
  65. // $ret['partnerid'] = WxPayConfig::MCHID;
  66. // $ret['prepayid'] = $order['prepay_id'];
  67. // $timeStamp = time();
  68. // $ret['timestamp'] = "{$timeStamp}";
  69. // $ret['sign'] = $this->make_sign($ret);
  70. return array("data" => $jsapi->GetValues());
  71. }
  72. private function toString($order)
  73. {
  74. $ret = '';
  75. foreach ($order as $key => $val) {
  76. $ret .= $key . "=" . $val;
  77. $ret .= '&';
  78. }
  79. return $ret;
  80. }
  81. private function make_sign($values)
  82. {
  83. //签名步骤一:按字典序排序参数
  84. ksort($values);
  85. $string = $this->to_url_params($values);
  86. //签名步骤二:在string后加入KEY
  87. $string = $string . "&key=" . WxPayConfig::KEY;
  88. //签名步骤三:MD5加密
  89. $string = md5($string);
  90. //签名步骤四:所有字符转为大写
  91. $result = strtoupper($string);
  92. return $result;
  93. }
  94. private function to_url_params($values)
  95. {
  96. $buff = "";
  97. foreach ($values as $k => $v) {
  98. if ($k != "sign" && $v != "" && !is_array($v)) {
  99. $buff .= $k . "=" . $v . "&";
  100. }
  101. }
  102. $buff = trim($buff, "&");
  103. return $buff;
  104. }
  105. public function on_notify($post)
  106. {
  107. }
  108. }