WxAllin_payment.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. <?php
  2. $payment_lang = array(
  3. 'name' => '通联微信支付',
  4. 'cusid' => '商户号(平台分配)',
  5. 'appid' =>'应用ID(平台分配)',
  6. 'key' => '密钥KEY(平台分配)',
  7. 'sub_appid' => '微信appid',
  8. 'sub_mchid' =>'微信子商户号',
  9. 'wxapp_key' => '微信密钥KEY',
  10. );
  11. $config = array(
  12. 'cusid' => array(
  13. 'INPUT_TYPE' => '0',
  14. ),
  15. 'appid' => array(
  16. 'INPUT_TYPE' => '0'
  17. ),
  18. 'key' => array(
  19. 'INPUT_TYPE' => '0'
  20. ),
  21. 'sub_appid' => array(
  22. 'INPUT_TYPE' => '0'
  23. ),
  24. 'sub_mchid' => array(
  25. 'INPUT_TYPE' => '0'
  26. ),
  27. 'wxapp_key' => array(
  28. 'INPUT_TYPE' => '0'
  29. )
  30. );
  31. /* 模块的基本信息 */
  32. if (isset($read_modules) && $read_modules == true)
  33. {
  34. $module['class_name'] = 'WxAllin';
  35. /* 名称 */
  36. $module['name'] = $payment_lang['name'];
  37. /* 支付方式:1:在线支付;0:线下支付 2:仅wap支付 3:仅app支付 4:兼容wap和app*/
  38. $module['online_pay'] = '3';
  39. /* 配送 */
  40. $module['config'] = $config;
  41. $module['lang'] = $payment_lang;
  42. $module['reg_url'] = '';
  43. return $module;
  44. }
  45. // 支付宝手机支付模型
  46. require_once(APP_ROOT_PATH.'system/libs/payment.php');
  47. class WxAllin_payment implements payment {
  48. public function get_payment_code($payment_notice_id)
  49. {
  50. $payment_notice = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."payment_notice where id = ".$payment_notice_id);
  51. //log_result("==payment_notice==");
  52. //log_result($payment_notice);
  53. //$order_sn = $GLOBALS['db']->getOne("select order_sn from ".DB_PREFIX."deal_order where id = ".$payment_notice['order_id']);
  54. $money = round($payment_notice['money'],2);
  55. $payment_info = $GLOBALS['db']->getRow("select id,config,logo from ".DB_PREFIX."payment where id=".intval($payment_notice['payment_id']));
  56. $payment_info['config'] = unserialize($payment_info['config']);
  57. $m_config = load_auto_cache("m_config");
  58. $title_name = $m_config['ticket_name'];
  59. if($title_name=='')
  60. $title_name = '虚拟印币';
  61. if(empty($title_name))
  62. {
  63. $title_name = "充值".round($payment_notice['money'],2)."元";
  64. }
  65. $pay['pay_info'] = $title_name;
  66. $pay['payment_name'] = "通联微信支付";
  67. $pay['pay_money'] = $money;
  68. $pay['pay_id'] = $payment_notice['id'];
  69. $pay['class_name'] = "WxAllin";
  70. //$subject = msubstr($title_name,0,40);
  71. $subject = $title_name;
  72. $data_notify_url = 'http://live.huangjiaxiuchang.com/callback/payment/wxallin_notify.php';
  73. require_once(APP_ROOT_PATH.'system/payment/Wxapp/WxPay.Api.php');
  74. require_once(APP_ROOT_PATH.'system/payment/Wxapp/WxPay.Notify.php');
  75. require_once(APP_ROOT_PATH.'system/payment/Wxapp/WxPay.Data.php');
  76. $nonce_str = WxPayApi::getNonceStr();
  77. $params = array();
  78. $params['cusid'] = $payment_info['config']['cusid'];//商户号 平台分配
  79. $params['appid'] = $payment_info['config']['appid'];//应用ID 平台分配的APPID
  80. $params['version'] = '11';//版本号 接口版本号 可 2 默认填11
  81. $params['trxamt'] = $payment_notice['money'] * 100;//交易金额 单位为分
  82. $params['reqsn'] = $payment_notice['id'];//商户交易单号 商户的交易订单号 否 32 商户平台唯一
  83. $params['paytype'] = 2;//交易方式 2:微信app支付
  84. $params['randomstr'] = $nonce_str;//rand(1000000000, 9000000000);//随机字符串 商户自行生成的随机字符串
  85. $params['body'] = $title_name;//订单标题 订单商品名称,为空则以商户名作为商品名称
  86. $params['validtime'] = 86400;//有效时间 订单有效时间,以分为单位,不填默认为15分钟
  87. $params['sub_appid'] = $payment_info['config']['sub_appid'];//微信appid 微信app支付必填, 开发者在微信开放平台申请 是
  88. ;
  89. $params['sub_mchid'] = $payment_info['config']['sub_mchid'];//微信子商户号 微信app支付必填,由通联平台分配 是
  90. //交易结果通知地址 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。 是 256 对于微信刷卡支付,该字段无效
  91. $params['notify_url'] = $data_notify_url;
  92. //指定支付方式 no_credit--指定不能使用信用卡支付 否 32 目前仅支持no_credit
  93. $params['limit_pay'] = 'no_credit';
  94. ksort($params);
  95. reset($params);
  96. $sign = '';
  97. foreach ($params as $key => $val) {
  98. $sign .= "$key=$val&";
  99. }
  100. $sign = substr($sign, 0, -1) . $payment_info['config']['key'];
  101. $sign_md5 = md5($sign);
  102. $params['sign'] = $sign_md5;
  103. //接口地址:https://vsp.allinpay.com/apiweb/weixin/pay
  104. //接入测试参数:
  105. /*
  106. 商户号:990581007426001
  107. APPID:00000051
  108. KEY:allinpay888
  109. URL: http://113.108.182.3:10080/apiweb/weixin
  110. */
  111. $url = 'http://113.108.182.3:10080/apiweb/weixin';
  112. //print_r($params);
  113. require_once(APP_ROOT_PATH.'system/utils/transport.php');
  114. $trans = new transport();
  115. $req = $trans->request($url,$params);
  116. print_r($req['body']);
  117. $ret = json_decode($req['body'],true);
  118. if ($ret['retcode'] == 'SUCCESS'){
  119. /*
  120. cusid 商户号 平台分配的商户号 否 15
  121. appid 应用ID 平台分配的APPID 否 8
  122. trxid 交易单号 平台的交易流水号 否 20
  123. chnltrxid 微信交易单号 微信平台的交易单号 是 50
  124. reqsn 商户交易单号 商户的交易订单号 否 32
  125. randomstr 随机字符串 随机生成的字符串 否 32
  126. trxstatus 交易状态 交易的状态,
  127. 对于微信刷卡支付,该状态表示实际的支付结果,其他为下单状态 否 4 详见3.1
  128. fintime 交易完成时间 yyyyMMddHHmmss 是 14 对于微信刷卡支付有效
  129. errmsg 错误原因 失败的原因说明 是 100
  130. weixinstr 微信支付串 App支付返回json串 是 不限 见第4章节示例
  131. sign 签名 否 32 详见1.5
  132. {"appid":"00000006","cusid":"XXXXXXXX","weixinstr":"{\"partnerId \":\"10000100\",\"timeStamp\":\"1477356696\",\"prepayId\":\"1101000000140415649af9fc314aa427\",\"package\":\"Sign=WXPay\",\"nonceStr\":\"38642\",\"sign\":\"66FF000B739F459D093FE24AB3462170\"}","reqsn":"1610258923119024","retcode":"SUCCESS","sign":"9513D3ABF5983F3FACCD8161931DB1ED","trxid":"180681592","trxstatus":"0000"}
  133. */
  134. $result = json_decode($ret['weixinstr'],true);
  135. $timestamp = get_gmtime();
  136. define('WXAPP_KEY',$payment_info['config']['wxapp_key']);
  137. //调起支付
  138. $wx_pay = new WxPayDataBase();
  139. $wx_pay->Set('appid',$payment_info['config']['sub_appid']);
  140. $wx_pay->Set('partnerid',$payment_info['config']['sub_mchid']);
  141. $wx_pay->Set('prepayid',$result['prepay_id']);//预支付交易会话ID
  142. $wx_pay->Set('package','prepay_id='.$result['prepay_id']);//android 写法
  143. $wx_pay->Set('noncestr',$nonce_str);//随机字符串
  144. $wx_pay->Set('timestamp',$timestamp);//时间戳
  145. $wx_pay->SetSign(false);//签名
  146. $pay['config'] = $wx_pay->GetValues();
  147. $wx_pay = new WxPayDataBase();
  148. $wx_pay->Set('appid',$payment_info['config']['sub_appid']);
  149. $wx_pay->Set('partnerid',$payment_info['config']['sub_mchid']);
  150. $wx_pay->Set('prepayid',$result['prepay_id']);//预支付交易会话ID
  151. $wx_pay->Set('package','Sign=Wxpay');//ios 写法
  152. $wx_pay->Set('noncestr',$nonce_str);//随机字符串
  153. $wx_pay->Set('timestamp',$timestamp);//时间戳
  154. $wx_pay->SetSign(false);//签名
  155. $pay['config']['ios'] = $wx_pay->GetValues();
  156. $pay['config']['packagevalue'] = 'prepay_id='.$result['prepay_id'];
  157. $pay['config']['subject'] = $subject;
  158. $pay['config']['body'] = $title_name;
  159. $pay['config']['total_fee'] = $money;
  160. $pay['config']['total_fee_format'] = format_price($money);
  161. $pay['config']['out_trade_no'] = $payment_notice['notice_sn'];
  162. $pay['config']['notify_url'] = $data_notify_url;
  163. //$pay['mch_id'] = $payment_info['config']['wxapp_partnerid'];
  164. //$pay['config']['key'] = $payment_info['config']['wxapp_key'];
  165. //$pay['config']['secret'] = $payment_info['config']['wxapp_secret'];
  166. if(isios())
  167. {
  168. $pay['sdk_code'] = array("pay_sdk_type"=>"wxpay","config"=>
  169. array(
  170. "appid"=>$payment_info['config']['sub_appid'],
  171. "partnerid"=>$payment_info['config']['sub_mchid'],
  172. "prepayid"=>$result['prepay_id'],
  173. "noncestr"=>$nonce_str,
  174. "timestamp"=>$timestamp,
  175. "package"=>"Sign=Wxpay",
  176. "sign" => $pay['config']['ios']['sign']
  177. )
  178. );
  179. }else{
  180. $pay['sdk_code'] = array("pay_sdk_type"=>"wxpay","config"=>
  181. array(
  182. "appid"=>$payment_info['config']['sub_appid'],
  183. "partnerid"=>$payment_info['config']['sub_mchid'],
  184. "prepayid"=>$result['prepay_id'],
  185. "noncestr"=>$nonce_str,
  186. "timestamp"=>$timestamp,
  187. "packagevalue"=>'prepay_id='.$result['prepay_id'],
  188. "sign"=>$pay['config']['sign']
  189. )
  190. );
  191. }
  192. $pay['ret'] = $ret;
  193. }else{
  194. //$ret['retmsg']
  195. $pay = $ret;
  196. }
  197. return $pay;
  198. }
  199. public function notify($request)
  200. {
  201. /*
  202. appid 平台分配的APPID
  203. outtrxid 收银宝平台流水号 通联系统内唯一
  204. trxcode 交易类型 见附录3.2
  205. trxid 通联交易流水号 通联系统内唯一
  206. trxamt 交易金额 分为单位
  207. trxdate 交易请求日期 yyyyMMdd
  208. paytime 交易完成时间 yyyyMMddHHmmss
  209. chnltrxid 微信交易单号 微信订单号
  210. trxstatus 交易状态 见3.1
  211. cusid 商户号
  212. termno 终端号
  213. termbatchid 终端批次号
  214. termtraceno 终端流水号
  215. termauthno 终端授权码
  216. termrefnum 终端参考号
  217. trxreserved 交易备注
  218. srctrxid 原交易ID 对于冲正、撤销、退货等交易时填写
  219. cusorderid 商户订单号
  220. acct 支付人帐号 微信支付的openid
  221. 如果信息为空,则默认填写000000
  222. sign 签名信息 详见1.5
  223. */
  224. $payment = $GLOBALS['db']->getRow("select id,config from ".DB_PREFIX."payment where class_name='WxAllin'");
  225. $payment['config'] = unserialize($payment['config']);
  226. /* 检查数字签名是否正确 */
  227. ksort($request);
  228. reset($request);
  229. foreach ($request AS $key=>$val)
  230. {
  231. if ($key != 'sign')
  232. {
  233. $sign .= "$key=$val&";
  234. }
  235. }
  236. $sign = substr($sign, 0, -1) . $payment['config']['key'];
  237. if (md5($sign) == $request['sign'])
  238. {
  239. if ($request['return_code'] == 'SUCCESS'){
  240. $payment_notice_sn = strim($request['cusorderid']);
  241. $outer_notice_sn = $request['outtrxid'];
  242. require_once APP_ROOT_PATH."system/libs/cart.php";
  243. $rs = payment_paid($payment_notice_sn,$outer_notice_sn);
  244. if ($rs)
  245. {
  246. echo "success";
  247. }else{
  248. echo "success";
  249. }
  250. }else{
  251. echo "fail";
  252. }
  253. }else{
  254. echo "fail";
  255. }
  256. }
  257. //响应通知
  258. function response($request)
  259. {}
  260. //获取接口的显示
  261. function get_display_code()
  262. {
  263. return "通联微信支付";
  264. }
  265. }
  266. ?>