unionpay.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. require_once PLUGINS_PATH . '/payments/unionpay/sdk/acp_service.php';
  3. class unionpay {
  4. private $config;
  5. public function __construct($payment_info = array(), $order_info = array()) {
  6. if (!empty($payment_info)) {
  7. $this->config = array(
  8. 'unionpay_merid' => $payment_info['payment_config']['unionpay_merid'],
  9. );
  10. com\unionpay\acp\sdk\SDKConfig::setSDKConfig('backUrl',str_replace('/index.php', '', HOME_SITE_URL) . "/payment/unionpay_notify.html");
  11. com\unionpay\acp\sdk\SDKConfig::setSDKConfig('frontUrl',str_replace('/index.php', '', HOME_SITE_URL) . "/payment/unionpay_return.html");
  12. com\unionpay\acp\sdk\SDKConfig::setSDKConfig('signCertPath',$payment_info['payment_config']['unionpay_signcert_path']);
  13. com\unionpay\acp\sdk\SDKConfig::setSDKConfig('signCertPwd',$payment_info['payment_config']['unionpay_signcert_pwd']);
  14. com\unionpay\acp\sdk\SDKConfig::setSDKConfig('encryptCertPath',PLUGINS_PATH . '/payments/unionpay/asserts/acp_prod_enc.cer');
  15. com\unionpay\acp\sdk\SDKConfig::setSDKConfig('middleCertPath',PLUGINS_PATH . '/payments/unionpay/asserts/acp_prod_middle.cer');
  16. com\unionpay\acp\sdk\SDKConfig::setSDKConfig('rootCertPath',PLUGINS_PATH . '/payments/unionpay/acp_prod_root.cer');
  17. com\unionpay\acp\sdk\SDKConfig::setSDKConfig('logFilePath',PLUGINS_PATH . '/payments/unionpay/logs');
  18. }
  19. }
  20. /**
  21. * 获取支付接口的请求地址
  22. *
  23. * @return string
  24. */
  25. public function get_payform($order_info) {
  26. header ( 'Content-type:text/html;charset=utf-8' );
  27. $params = array(
  28. //以下信息非特殊情况不需要改动
  29. 'version' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version, //版本号
  30. 'encoding' => 'utf-8', //编码方式
  31. 'txnType' => '01', //交易类型
  32. 'txnSubType' => '01', //交易子类
  33. 'bizType' => '000201', //业务类型
  34. 'frontUrl' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontUrl, //前台通知地址
  35. 'backUrl' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backUrl, //后台通知地址
  36. 'signMethod' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod, //签名方法
  37. 'channelType' => '08', //渠道类型,07-PC,08-手机
  38. 'accessType' => '0', //接入类型
  39. 'currencyCode' => '156', //交易币种,境内商户固定156
  40. //TODO 以下信息需要填写
  41. 'merId' => $this->config["unionpay_merid"], //商户代码,请改自己的测试商户号,此处默认取demo演示页面传递的参数
  42. 'orderId' => $order_info['pay_sn'], //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则
  43. 'txnTime' => date('YmdHis'), //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数
  44. 'txnAmt' => bcmul($order_info['api_pay_amount'], 100), //交易金额,单位分,此处默认取demo演示页面传递的参数
  45. // 订单超时时间。
  46. // 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。
  47. // 此时间建议取支付时的北京时间加15分钟。
  48. // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。
  49. 'payTimeout' => date('YmdHis', strtotime('+15 minutes')),
  50. 'reqReserved'=>$order_info['order_type'],
  51. // 请求方保留域,
  52. // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。
  53. // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写:
  54. // 1. 如果能确定内容不会出现&={}[]"'等符号时,可以直接填写数据,建议的方法如下。
  55. // 'reqReserved' =>'透传信息1|透传信息2|透传信息3',
  56. // 2. 内容可能出现&={}[]"'符号时:
  57. // 1) 如果需要对账文件里能显示,可将字符替换成全角&={}【】“‘字符(自己写代码,此处不演示);
  58. // 2) 如果对账文件没有显示要求,可做一下base64(如下)。
  59. // 注意控制数据长度,实际传输的数据长度不能超过1024位。
  60. // 查询、通知等接口解析时使用base64_decode解base64后再对数据做后续解析。
  61. // 'reqReserved' => base64_encode('任意格式的信息都可以'),
  62. //TODO 其他特殊用法请查看 special_use_purchase.php
  63. );
  64. com\unionpay\acp\sdk\AcpService::sign($params);
  65. $uri = com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontTransUrl;
  66. $html_form = com\unionpay\acp\sdk\AcpService::createAutoFormHtml($params, $uri);
  67. echo $html_form;
  68. exit;
  69. }
  70. public function return_verify() {
  71. return $this->getPayResult();
  72. }
  73. public function verify_notify() {
  74. return $this->getPayResult();
  75. }
  76. public function getPayResult() {
  77. $notify_result = array(
  78. 'trade_status' => '0',
  79. );
  80. $result = com\unionpay\acp\sdk\AcpService::validate ( $_POST );
  81. if ($result) {
  82. if (input('post.respCode')=='00' || input('post.respCode')=='A6') {
  83. $out_trade_no = input('post.orderId');
  84. $notify_result = array(
  85. 'out_trade_no' => $out_trade_no, #商户订单号
  86. 'trade_no' => input('param.traceNo'), #交易凭据单号
  87. 'total_fee' => bcdiv(input('param.settleAmt'),100), #涉及金额
  88. 'order_type' => input('param.reqReserved'),
  89. 'trade_status' => '1',
  90. );
  91. }
  92. }
  93. return $notify_result;
  94. }
  95. }