Aliapp_payment.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?php
  2. $payment_lang = array(
  3. 'name' => '新支付宝(SDK版本)',
  4. 'aliapp_partner' => '合作者身份ID',
  5. 'aliapp_seller_id' => '支付宝帐号',
  6. 'aliapp_rsa_public' => '支付宝(RSA)公钥',
  7. 'aliapp_rsa_private_key' => '商家RSA私钥',
  8. );
  9. $config = array(
  10. 'aliapp_partner' => array(
  11. 'INPUT_TYPE' => '0',
  12. ), //合作者身份ID
  13. 'aliapp_seller_id' => array(
  14. 'INPUT_TYPE' => '0'
  15. ), //支付宝帐号:
  16. //支付宝(RSA)公钥
  17. 'aliapp_rsa_public' => array(
  18. 'INPUT_TYPE' => '0'
  19. ),
  20. //商家RSA私钥
  21. 'aliapp_rsa_private_key' => array(
  22. 'INPUT_TYPE' => '0'
  23. )
  24. );
  25. /* 模块的基本信息 */
  26. if (isset($read_modules) && $read_modules == true)
  27. {
  28. $module['class_name'] = 'Aliapp';
  29. /* 名称 */
  30. $module['name'] = $payment_lang['name'];
  31. /* 支付方式:1:在线支付;0:线下支付 */
  32. $module['online_pay'] = '3';
  33. /* 配送 */
  34. $module['config'] = $config;
  35. $module['lang'] = $payment_lang;
  36. $module['reg_url'] = '';
  37. return $module;
  38. }
  39. // 支付宝手机支付模型
  40. require_once(APP_ROOT_PATH.'system/libs/payment.php');
  41. class Aliapp_payment implements payment {
  42. public function get_payment_code($payment_notice_id)
  43. {
  44. $payment_notice = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."payment_notice where id = ".$payment_notice_id);
  45. $money = round($payment_notice['money'],2);
  46. $payment_info = $GLOBALS['db']->getRow("select id,config,logo from ".DB_PREFIX."payment where id=".intval($payment_notice['payment_id']));
  47. $payment_info['config'] = unserialize($payment_info['config']);
  48. /*$sql = "select name ".
  49. "from ".DB_PREFIX."deal_order_item ".
  50. "where order_id =". intval($payment_notice['order_id']);
  51. $title_name = $GLOBALS['db']->getOne($sql);
  52. if(empty($title_name))
  53. {
  54. $title_name = "充值".round($payment_notice['money'],2)."元";
  55. }*/
  56. $m_config = load_auto_cache("m_config");
  57. $title_name = $m_config['ticket_name'];
  58. if($title_name=='')
  59. $title_name = '虚拟印币';
  60. $subject = msubstr($title_name,0,40);
  61. $notify_url = SITE_DOMAIN.'/callback/payment/aliapp_notify.php';
  62. $pay = array();
  63. $pay['pay_info'] = $title_name;
  64. $pay['payment_name'] = "支付宝";
  65. $pay['pay_money'] = $money;
  66. $pay['class_name'] = "Aliapp";
  67. $pay['config'] = array();
  68. $pay['config']['subject'] = $subject;
  69. $pay['config']['body'] = $title_name;
  70. $pay['config']['total_fee'] = $money;
  71. $pay['config']['total_fee_format'] = format_price($money);
  72. $pay['config']['out_trade_no'] = $payment_notice['notice_sn'];
  73. $pay['config']['notify_url'] = $notify_url;
  74. $pay['config']['payment_type'] = 1;//支付类型。默认值为:1(商品购买)。
  75. $pay['config']['service'] = 'mobile.securitypay.pay';
  76. $pay['config']['_input_charset'] = 'utf-8';
  77. $pay['config']['partner'] = $payment_info['config']['aliapp_partner'];//合作商户ID
  78. $pay['config']['seller_id'] = $payment_info['config']['aliapp_seller_id'];//账户ID
  79. $order_spec = '';
  80. $order_spec .= 'partner="'.$pay['config']['partner'].'"';//合作商户ID
  81. $order_spec .= '&seller_id="'.$pay['config']['seller_id'].'"';//账户ID
  82. $order_spec .= '&out_trade_no="'.$pay['config']['out_trade_no'].'"';
  83. $order_spec .= '&subject="'.$pay['config']['subject'].'"';
  84. $order_spec .= '&body="'.$pay['config']['body'].'"';
  85. $order_spec .= '&total_fee="'.$pay['config']['total_fee'].'"';
  86. $order_spec .= '&notify_url="'.$pay['config']['notify_url'].'"';
  87. $order_spec .= '&service="'.$pay['config']['service'].'"';
  88. $order_spec .= '&payment_type="'.$pay['config']['payment_type'].'"';
  89. $order_spec .= '&_input_charset="'.$pay['config']['_input_charset'].'"';
  90. $order_spec .= '&it_b_pay="30m"';
  91. $sign = $this->sign($order_spec,$payment_info['config']['aliapp_rsa_private_key']);
  92. $sign = urlencode($sign);
  93. /*
  94. $pubkey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6IQ/HH06GbTIhKNN/YSQXxllnP7cNERMuN16GgZDfuf9NrY/Bw2ZINkq1RMNlbP66Vu5y0gwYPC/7PbO5l6pbnl3N4rw5VY3U6rtIC0f8ADDLrIZwShYUitaFq+Ao7rhk/GbpfSD7vgnugQz74fVewi17S3Apujq4U4LAxFmVowIDAQAB';
  95. $pubkey = $this->getPublicKeyFromX509($pubkey);
  96. $res = openssl_pkey_get_public($pubkey);
  97. $sign = base64_decode($sign);
  98. $verify = openssl_verify($order_spec, $sign, $res);
  99. if ($verify == 1)
  100. {
  101. $pay['openssl_verify'] = 'ok';
  102. }else{
  103. $pay['openssl_verify'] = 'error';
  104. }
  105. */
  106. //
  107. // print_r($payment_info['config']);
  108. // print_r($pay);exit;
  109. $pay['sdk_code'] = array("pay_sdk_type"=>"alipay", "config"=>array("order_spec"=>$order_spec,"sign"=>$sign,"sign_type"=>"RSA"));
  110. return $pay;
  111. }
  112. public function notify($request)
  113. {
  114. //echo APP_ROOT_PATH."/alipaylog/ealipay_".date("Y-m-d H:i:s").".txt";exit;
  115. //file_put_contents(APP_ROOT_PATH."/pubilc/alipaylog/ealipay_".date("Y-m-dHis").".txt",print_r($_REQUEST,true));
  116. require_once(APP_ROOT_PATH.'system/payment/Aliapp/alipay_notify.class.php');
  117. $payment = $GLOBALS['db']->getRow("select id,config from ".DB_PREFIX."payment where class_name='Aliapp'");
  118. $payment['config'] = unserialize($payment['config']);
  119. $pubkey = $payment['config']['aliapp_rsa_public'];
  120. //计算得出通知验证结果
  121. $alipay_config = array();
  122. //签名方式 不需修改
  123. $alipay_config['sign_type'] = strtoupper('RSA');
  124. //字符编码格式 目前支持 gbk 或 utf-8
  125. $alipay_config['input_charset']= strtolower('utf-8');
  126. //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
  127. $alipay_config['transport'] = 'http';
  128. $alipay_config['aliapp_rsa_public'] = $payment['config']['aliapp_rsa_public'];
  129. $alipayNotify = new AlipayNotify($alipay_config);
  130. $verify_result = $alipayNotify->verifyNotify();
  131. if($verify_result) {//验证成功
  132. $trade_status = $_POST['trade_status'];
  133. $outer_notice_sn = $_POST['trade_no'];
  134. $payment_notice_sn = $_POST['out_trade_no'];
  135. if ($trade_status == 'TRADE_SUCCESS' || $trade_status == 'TRADE_FINISHED' || $trade_status == 'WAIT_SELLER_SEND_GOODS'){
  136. $payment_notice = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."payment_notice where notice_sn = '".$payment_notice_sn."'");
  137. //file_put_contents(APP_ROOT_PATH."/alipaylog/payment_notice_sn_3.txt",$payment_notice_sn);
  138. //$order_info = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."deal_order where id = ".$payment_notice['order_id']);
  139. require_once APP_ROOT_PATH."system/libs/cart.php";
  140. $rs = payment_paid($payment_notice['notice_sn'],$outer_notice_sn);
  141. if ($rs)
  142. {
  143. //file_put_contents(APP_ROOT_PATH."/alipaylog/1.txt","");
  144. //$GLOBALS['db']->query("update ".DB_PREFIX."payment_notice set outer_notice_sn = '".$outer_notice_sn."' where id = ".$payment_notice['id']);
  145. //order_paid($payment_notice['order_id']);
  146. echo "success";
  147. }else{
  148. //file_put_contents(APP_ROOT_PATH."/alipaylog/2.txt","");
  149. echo "success";
  150. }
  151. }else{
  152. //file_put_contents(APP_ROOT_PATH."/alipaylog/3.txt","");
  153. echo "fail";
  154. }
  155. }else{
  156. echo "fail";
  157. }
  158. }
  159. function getPublicKeyFromX509($certificate)
  160. {
  161. $publicKeyString = "-----BEGIN PUBLIC KEY-----\n" .
  162. wordwrap($certificate, 64, "\n", true) .
  163. "\n-----END PUBLIC KEY-----";
  164. return $publicKeyString;
  165. }
  166. function getPrivateKeyFromX509($certificate)
  167. {
  168. $privateKeyString = "-----BEGIN RSA PRIVATE KEY-----\n" .
  169. wordwrap($certificate, 64, "\n", true) .
  170. "\n-----END RSA PRIVATE KEY-----";
  171. return $privateKeyString;
  172. }
  173. /**RSA签名
  174. * $data待签名数据
  175. * 签名用商户私钥,必须是没有经过pkcs8转换的私钥
  176. * 最后的签名,需要用base64编码
  177. * return Sign签名
  178. */
  179. function sign($data,$rsa_private_key) {
  180. //读取私钥文件
  181. //$priKey = file_get_contents(APP_ROOT_PATH.'/mapi/key/rsa_private_key.pem');
  182. $priKey = $this->getPrivateKeyFromX509($rsa_private_key);
  183. //print_r($priKey); exit;
  184. //转换为openssl密钥,必须是没有经过pkcs8转换的私钥
  185. $res = openssl_get_privatekey($priKey);
  186. //调用openssl内置签名方法,生成签名$sign
  187. openssl_sign($data, $sign, $res);
  188. //释放资源
  189. openssl_free_key($res);
  190. //base64编码
  191. $sign = base64_encode($sign);
  192. return $sign;
  193. }
  194. //响应通知
  195. function response($request)
  196. {}
  197. //获取接口的显示
  198. public function get_display_code(){
  199. return "支付宝支付";
  200. }
  201. }
  202. ?>