wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。本文分享Native(原生)支付模式一demo,供技术员参考学习。

wemall官网地址:http://www.wemallshop.com

模式一:商户按固定格式生成链接二维码,用户扫码后调微信

* 会将productid和用户openid发送到商户设置的链接上,商户收到

* 请求生成订单,调用统一支付接口下单提交到微信,微信会返回

* 给商户prepayid。

* 本例程对应的二维码由native_call_qrcode.php生成;

* 本例程对应的响应服务为native_call.php;

* 需要两者配合使用。

native_call.php

  1. <?php
  2. include_once("./log_.php");
  3. include_once("../WxPayPubHelper/WxPayPubHelper.php");
  4.  
  5. //以log文件形式记录回调信息,用于调试
  6. $log_ = new Log_();
  7. $log_name="./native_call.log";
  8.  
  9. //使用native通知接口
  10. $nativeCall = new NativeCall_pub();
  11.  
  12. //接收微信请求
  13. $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
  14. $log_->log_result($log_name,"【接收到的native通知】:\n".$xml."\n");
  15. $nativeCall->saveData($xml);
  16.  
  17. if($nativeCall->checkSign() == FALSE){
  18. $nativeCall->setReturnParameter("return_code","FAIL");//返回状态码
  19. $nativeCall->setReturnParameter("return_msg","签名失败");//返回信息
  20. }else{
  21. //提取product_id
  22. $product_id = $nativeCall->getProductId();
  23.  
  24. //使用统一支付接口
  25. $unifiedOrder = new UnifiedOrder_pub();
  26.  
  27. //根据不同的$product_id设定对应的下单参数,此处只举例一种
  28. switch ($product_id)
  29. {
  30. case WxPayConf_pub::APPID."static"://与native_call_qrcode.php中的静态链接二维码对应
  31. //设置统一支付接口参数
  32. //设置必填参数
  33. //appid已填,商户无需重复填写
  34. //mch_id已填,商户无需重复填写
  35. //noncestr已填,商户无需重复填写
  36. //spbill_create_ip已填,商户无需重复填写
  37. //sign已填,商户无需重复填写
  38. $unifiedOrder->setParameter("body","贡献一分钱");//商品描述
  39. //自定义订单号,此处仅作举例
  40. $timeStamp = time();
  41. $out_trade_no = WxPayConf_pub::APPID."$timeStamp";
  42. $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 $unifiedOrder->setParameter("product_id","$product_id");//商品ID
  43. $unifiedOrder->setParameter("total_fee","1");//总金额
  44. $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址
  45. $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
  46. $unifiedOrder->setParameter("product_id","$product_id");//用户标识
  47. //非必填参数,商户可根据实际情况选填
  48. //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
  49. //$unifiedOrder->setParameter("device_info","XXXX");//设备号
  50. //$unifiedOrder->setParameter("attach","XXXX");//附加数据
  51. //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
  52. //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
  53. //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
  54. //$unifiedOrder->setParameter("openid","XXXX");//用户标识
  55.  
  56. //获取prepay_id
  57. $prepay_id = $unifiedOrder->getPrepayId();
  58. //设置返回码
  59. //设置必填参数
  60. //appid已填,商户无需重复填写
  61. //mch_id已填,商户无需重复填写
  62. //noncestr已填,商户无需重复填写
  63. //sign已填,商户无需重复填写
  64. $nativeCall->setReturnParameter("return_code","SUCCESS");//返回状态码
  65. $nativeCall->setReturnParameter("result_code","SUCCESS");//业务结果
  66. $nativeCall->setReturnParameter("prepay_id","$prepay_id");//预支付ID
  67.  
  68. break;
  69. default:
  70. //设置返回码
  71. //设置必填参数
  72. //appid已填,商户无需重复填写
  73. //mch_id已填,商户无需重复填写
  74. //noncestr已填,商户无需重复填写
  75. //sign已填,商户无需重复填写
  76. $nativeCall->setReturnParameter("return_code","SUCCESS");//返回状态码
  77. $nativeCall->setReturnParameter("result_code","FAIL");//业务结果
  78. $nativeCall->setReturnParameter("err_code_des","此商品无效");//业务结果
  79. break;
  80. }
  81.  
  82. }
  83.  
  84. //将结果返回微信
  85. $returnXml = $nativeCall->returnXml();
  86. $log_->log_result($log_name,"【返回微信的native响应】:\n".$returnXml."\n");
  87.  
  88. echo $returnXml;
  89.  
  90. //交易完成
  91.  
  92. ?>

log_.php

  1. <?php
  2.  
  3. class Log_
  4. {
  5. // 打印log
  6. function log_result($file,$word)
  7. {
  8. $fp = fopen($file,"a");
  9. flock($fp, LOCK_EX) ;
  10. fwrite($fp,"执行日期:".strftime("%Y-%m-%d-%H:%M:%S",time())."\n".$word."\n\n");
  11. flock($fp, LOCK_UN);
  12. fclose($fp);
  13. }
  14. }
  15.  
  16. ?>

  

WxPayPubHelper.php

  1. <?php
  2. /**
  3. * 微信支付帮助库
  4. * ====================================================
  5. * 接口分三种类型:
  6. * 【请求型接口】--Wxpay_client_
  7. * 统一支付接口类--UnifiedOrder
  8. * 订单查询接口--OrderQuery
  9. * 退款申请接口--Refund
  10. * 退款查询接口--RefundQuery
  11. * 对账单接口--DownloadBill
  12. * 短链接转换接口--ShortUrl
  13. * 【响应型接口】--Wxpay_server_
  14. * 通用通知接口--Notify
  15. * Native支付——请求商家获取商品信息接口--NativeCall
  16. * 【其他】
  17. * 静态链接二维码--NativeLink
  18. * JSAPI支付--JsApi
  19. * =====================================================
  20. * 【CommonUtil】常用工具:
  21. * trimString(),设置参数时需要用到的字符处理函数
  22. * createNoncestr(),产生随机字符串,不长于32位
  23. * formatBizQueryParaMap(),格式化参数,签名过程需要用到
  24. * getSign(),生成签名
  25. * arrayToXml(),array转xml
  26. * xmlToArray(),xml转 array
  27. * postXmlCurl(),以post方式提交xml到对应的接口url
  28. * postXmlSSLCurl(),使用证书,以post方式提交xml到对应的接口url
  29. */
  30. include_once("SDKRuntimeException.php");
  31. include_once("WxPay.pub.config.php");
  32.  
  33. /**
  34. * 所有接口的基类
  35. */
  36. class Common_util_pub
  37. {
  38. function __construct() {
  39. }
  40.  
  41. function trimString($value)
  42. {
  43. $ret = null;
  44. if (null != $value)
  45. {
  46. $ret = $value;
  47. if (strlen($ret) == 0)
  48. {
  49. $ret = null;
  50. }
  51. }
  52. return $ret;
  53. }
  54.  
  55. /**
  56. * 作用:产生随机字符串,不长于32位
  57. */
  58. public function createNoncestr( $length = 32 )
  59. {
  60. $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  61. $str ="";
  62. for ( $i = 0; $i < $length; $i++ ) {
  63. $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
  64. }
  65. return $str;
  66. }
  67.  
  68. /**
  69. * 作用:格式化参数,签名过程需要使用
  70. */
  71. function formatBizQueryParaMap($paraMap, $urlencode)
  72. {
  73. $buff = "";
  74. ksort($paraMap);
  75. foreach ($paraMap as $k => $v)
  76. {
  77. if($urlencode)
  78. {
  79. $v = urlencode($v);
  80. }
  81. //$buff .= strtolower($k) . "=" . $v . "&";
  82. $buff .= $k . "=" . $v . "&";
  83. }
  84. $reqPar;
  85. if (strlen($buff) > 0)
  86. {
  87. $reqPar = substr($buff, 0, strlen($buff)-1);
  88. }
  89. return $reqPar;
  90. }
  91.  
  92. /**
  93. * 作用:生成签名
  94. */
  95. public function getSign($Obj)
  96. {
  97. foreach ($Obj as $k => $v)
  98. {
  99. $Parameters[$k] = $v;
  100. }
  101. //签名步骤一:按字典序排序参数
  102. ksort($Parameters);
  103. $String = $this->formatBizQueryParaMap($Parameters, false);
  104. //echo '【string1】'.$String.'</br>';
  105. //签名步骤二:在string后加入KEY
  106. $String = $String."&key=".WxPayConf_pub::KEY;
  107. //echo "【string2】".$String."</br>";
  108. //签名步骤三:MD5加密
  109. $String = md5($String);
  110. //echo "【string3】 ".$String."</br>";
  111. //签名步骤四:所有字符转为大写
  112. $result_ = strtoupper($String);
  113. //echo "【result】 ".$result_."</br>";
  114. return $result_;
  115. }
  116.  
  117. /**
  118. * 作用:array转xml
  119. */
  120. function arrayToXml($arr)
  121. {
  122. $xml = "<xml>";
  123. foreach ($arr as $key=>$val)
  124. {
  125. if (is_numeric($val))
  126. {
  127. $xml.="<".$key.">".$val."</".$key.">";
  128.  
  129. }
  130. else
  131. $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
  132. }
  133. $xml.="</xml>";
  134. return $xml;
  135. }
  136.  
  137. /**
  138. * 作用:将xml转为array
  139. */
  140. public function xmlToArray($xml)
  141. {
  142. //将XML转为array
  143. $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  144. return $array_data;
  145. }
  146.  
  147. /**
  148. * 作用:以post方式提交xml到对应的接口url
  149. */
  150. public function postXmlCurl($xml,$url,$second=30)
  151. {
  152. //初始化curl
  153. $ch = curl_init();
  154. //设置超时
  155. curl_setopt($ch, CURLOP_TIMEOUT, $second);
  156. //这里设置代理,如果有的话
  157. //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
  158. //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
  159. curl_setopt($ch,CURLOPT_URL, $url);
  160. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  161. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
  162. //设置header
  163. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  164. //要求结果为字符串且输出到屏幕上
  165. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  166. //post提交方式
  167. curl_setopt($ch, CURLOPT_POST, TRUE);
  168. curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
  169. //运行curl
  170. $data = curl_exec($ch);
  171. curl_close($ch);
  172. //返回结果
  173. if($data)
  174. {
  175. curl_close($ch);
  176. return $data;
  177. }
  178. else
  179. {
  180. $error = curl_errno($ch);
  181. echo "curl出错,错误码:$error"."<br>";
  182. echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
  183. curl_close($ch);
  184. return false;
  185. }
  186. }
  187.  
  188. /**
  189. * 作用:使用证书,以post方式提交xml到对应的接口url
  190. */
  191. function postXmlSSLCurl($xml,$url,$second=30)
  192. {
  193. $ch = curl_init();
  194. //超时时间
  195. curl_setopt($ch,CURLOPT_TIMEOUT,$second);
  196. //这里设置代理,如果有的话
  197. //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
  198. //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
  199. curl_setopt($ch,CURLOPT_URL, $url);
  200. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  201. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
  202. //设置header
  203. curl_setopt($ch,CURLOPT_HEADER,FALSE);
  204. //要求结果为字符串且输出到屏幕上
  205. curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
  206. //设置证书
  207. //使用证书:cert 与 key 分别属于两个.pem文件
  208. //默认格式为PEM,可以注释
  209. curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
  210. curl_setopt($ch,CURLOPT_SSLCERT, WxPayConf_pub::SSLCERT_PATH);
  211. //默认格式为PEM,可以注释
  212. curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
  213. curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH);
  214. //post提交方式
  215. curl_setopt($ch,CURLOPT_POST, true);
  216. curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
  217. $data = curl_exec($ch);
  218. //返回结果
  219. if($data){
  220. curl_close($ch);
  221. return $data;
  222. }
  223. else {
  224. $error = curl_errno($ch);
  225. echo "curl出错,错误码:$error"."<br>";
  226. echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
  227. curl_close($ch);
  228. return false;
  229. }
  230. }
  231.  
  232. /**
  233. * 作用:打印数组
  234. */
  235. function printErr($wording='',$err='')
  236. {
  237. print_r('<pre>');
  238. echo $wording."</br>";
  239. var_dump($err);
  240. print_r('</pre>');
  241. }
  242. }
  243.  
  244. /**
  245. * 请求型接口的基类
  246. */
  247. class Wxpay_client_pub extends Common_util_pub
  248. {
  249. var $parameters;//请求参数,类型为关联数组
  250. public $response;//微信返回的响应
  251. public $result;//返回参数,类型为关联数组
  252. var $url;//接口链接
  253. var $curl_timeout;//curl超时时间
  254.  
  255. /**
  256. * 作用:设置请求参数
  257. */
  258. function setParameter($parameter, $parameterValue)
  259. {
  260. $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  261. }
  262.  
  263. /**
  264. * 作用:设置标配的请求参数,生成签名,生成接口参数xml
  265. */
  266. function createXml()
  267. {
  268. $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  269. $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  270. $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
  271. $this->parameters["sign"] = $this->getSign($this->parameters);//签名
  272. return $this->arrayToXml($this->parameters);
  273. }
  274.  
  275. /**
  276. * 作用:post请求xml
  277. */
  278. function postXml()
  279. {
  280. $xml = $this->createXml();
  281. $this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
  282. return $this->response;
  283. }
  284.  
  285. /**
  286. * 作用:使用证书post请求xml
  287. */
  288. function postXmlSSL()
  289. {
  290. $xml = $this->createXml();
  291. $this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout);
  292. return $this->response;
  293. }
  294.  
  295. /**
  296. * 作用:获取结果,默认不使用证书
  297. */
  298. function getResult()
  299. {
  300. $this->postXml();
  301. $this->result = $this->xmlToArray($this->response);
  302. return $this->result;
  303. }
  304. }
  305.  
  306. /**
  307. * 统一支付接口类
  308. */
  309. class UnifiedOrder_pub extends Wxpay_client_pub
  310. {
  311. function __construct()
  312. {
  313. //设置接口链接
  314. $this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
  315. //设置curl超时时间
  316. $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  317. }
  318.  
  319. /**
  320. * 生成接口参数xml
  321. */
  322. function createXml()
  323. {
  324. try
  325. {
  326. //检测必填参数
  327. if($this->parameters["out_trade_no"] == null)
  328. {
  329. throw new SDKRuntimeException("缺少统一支付接口必填参数out_trade_no!"."<br>");
  330. }elseif($this->parameters["body"] == null){
  331. throw new SDKRuntimeException("缺少统一支付接口必填参数body!"."<br>");
  332. }elseif ($this->parameters["total_fee"] == null ) {
  333. throw new SDKRuntimeException("缺少统一支付接口必填参数total_fee!"."<br>");
  334. }elseif ($this->parameters["notify_url"] == null) {
  335. throw new SDKRuntimeException("缺少统一支付接口必填参数notify_url!"."<br>");
  336. }elseif ($this->parameters["trade_type"] == null) {
  337. throw new SDKRuntimeException("缺少统一支付接口必填参数trade_type!"."<br>");
  338. }elseif ($this->parameters["trade_type"] == "JSAPI" &&
  339. $this->parameters["openid"] == NULL){
  340. throw new SDKRuntimeException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."<br>");
  341. }
  342. $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  343. $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  344. $this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
  345. $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
  346. $this->parameters["sign"] = $this->getSign($this->parameters);//签名
  347. return $this->arrayToXml($this->parameters);
  348. }catch (SDKRuntimeException $e)
  349. {
  350. die($e->errorMessage());
  351. }
  352. }
  353.  
  354. /**
  355. * 获取prepay_id
  356. */
  357. function getPrepayId()
  358. {
  359. $this->postXml();
  360. $this->result = $this->xmlToArray($this->response);
  361. $prepay_id = $this->result["prepay_id"];
  362. return $prepay_id;
  363. }
  364.  
  365. }
  366.  
  367. /**
  368. * 订单查询接口
  369. */
  370. class OrderQuery_pub extends Wxpay_client_pub
  371. {
  372. function __construct()
  373. {
  374. //设置接口链接
  375. $this->url = "https://api.mch.weixin.qq.com/pay/orderquery";
  376. //设置curl超时时间
  377. $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  378. }
  379.  
  380. /**
  381. * 生成接口参数xml
  382. */
  383. function createXml()
  384. {
  385. try
  386. {
  387. //检测必填参数
  388. if($this->parameters["out_trade_no"] == null &&
  389. $this->parameters["transaction_id"] == null)
  390. {
  391. throw new SDKRuntimeException("订单查询接口中,out_trade_no、transaction_id至少填一个!"."<br>");
  392. }
  393. $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  394. $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  395. $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
  396. $this->parameters["sign"] = $this->getSign($this->parameters);//签名
  397. return $this->arrayToXml($this->parameters);
  398. }catch (SDKRuntimeException $e)
  399. {
  400. die($e->errorMessage());
  401. }
  402. }
  403.  
  404. }
  405.  
  406. /**
  407. * 退款申请接口
  408. */
  409. class Refund_pub extends Wxpay_client_pub
  410. {
  411.  
  412. function __construct() {
  413. //设置接口链接
  414. $this->url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
  415. //设置curl超时时间
  416. $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  417. }
  418.  
  419. /**
  420. * 生成接口参数xml
  421. */
  422. function createXml()
  423. {
  424. try
  425. {
  426. //检测必填参数
  427. if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) {
  428. throw new SDKRuntimeException("退款申请接口中,out_trade_no、transaction_id至少填一个!"."<br>");
  429. }elseif($this->parameters["out_refund_no"] == null){
  430. throw new SDKRuntimeException("退款申请接口中,缺少必填参数out_refund_no!"."<br>");
  431. }elseif($this->parameters["total_fee"] == null){
  432. throw new SDKRuntimeException("退款申请接口中,缺少必填参数total_fee!"."<br>");
  433. }elseif($this->parameters["refund_fee"] == null){
  434. throw new SDKRuntimeException("退款申请接口中,缺少必填参数refund_fee!"."<br>");
  435. }elseif($this->parameters["op_user_id"] == null){
  436. throw new SDKRuntimeException("退款申请接口中,缺少必填参数op_user_id!"."<br>");
  437. }
  438. $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  439. $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  440. $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
  441. $this->parameters["sign"] = $this->getSign($this->parameters);//签名
  442. return $this->arrayToXml($this->parameters);
  443. }catch (SDKRuntimeException $e)
  444. {
  445. die($e->errorMessage());
  446. }
  447. }
  448. /**
  449. * 作用:获取结果,使用证书通信
  450. */
  451. function getResult()
  452. {
  453. $this->postXmlSSL();
  454. $this->result = $this->xmlToArray($this->response);
  455. return $this->result;
  456. }
  457.  
  458. }
  459.  
  460. /**
  461. * 退款查询接口
  462. */
  463. class RefundQuery_pub extends Wxpay_client_pub
  464. {
  465.  
  466. function __construct() {
  467. //设置接口链接
  468. $this->url = "https://api.mch.weixin.qq.com/pay/refundquery";
  469. //设置curl超时时间
  470. $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  471. }
  472.  
  473. /**
  474. * 生成接口参数xml
  475. */
  476. function createXml()
  477. {
  478. try
  479. {
  480. if($this->parameters["out_refund_no"] == null &&
  481. $this->parameters["out_trade_no"] == null &&
  482. $this->parameters["transaction_id"] == null &&
  483. $this->parameters["refund_id "] == null)
  484. {
  485. throw new SDKRuntimeException("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!"."<br>");
  486. }
  487. $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  488. $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  489. $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
  490. $this->parameters["sign"] = $this->getSign($this->parameters);//签名
  491. return $this->arrayToXml($this->parameters);
  492. }catch (SDKRuntimeException $e)
  493. {
  494. die($e->errorMessage());
  495. }
  496. }
  497.  
  498. /**
  499. * 作用:获取结果,使用证书通信
  500. */
  501. function getResult()
  502. {
  503. $this->postXmlSSL();
  504. $this->result = $this->xmlToArray($this->response);
  505. return $this->result;
  506. }
  507.  
  508. }
  509.  
  510. /**
  511. * 对账单接口
  512. */
  513. class DownloadBill_pub extends Wxpay_client_pub
  514. {
  515.  
  516. function __construct()
  517. {
  518. //设置接口链接
  519. $this->url = "https://api.mch.weixin.qq.com/pay/downloadbill";
  520. //设置curl超时时间
  521. $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  522. }
  523.  
  524. /**
  525. * 生成接口参数xml
  526. */
  527. function createXml()
  528. {
  529. try
  530. {
  531. if($this->parameters["bill_date"] == null )
  532. {
  533. throw new SDKRuntimeException("对账单接口中,缺少必填参数bill_date!"."<br>");
  534. }
  535. $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  536. $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  537. $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
  538. $this->parameters["sign"] = $this->getSign($this->parameters);//签名
  539. return $this->arrayToXml($this->parameters);
  540. }catch (SDKRuntimeException $e)
  541. {
  542. die($e->errorMessage());
  543. }
  544. }
  545.  
  546. /**
  547. * 作用:获取结果,默认不使用证书
  548. */
  549. function getResult()
  550. {
  551. $this->postXml();
  552. $this->result = $this->xmlToArray($this->result_xml);
  553. return $this->result;
  554. }
  555.  
  556. }
  557.  
  558. /**
  559. * 短链接转换接口
  560. */
  561. class ShortUrl_pub extends Wxpay_client_pub
  562. {
  563. function __construct()
  564. {
  565. //设置接口链接
  566. $this->url = "https://api.mch.weixin.qq.com/tools/shorturl";
  567. //设置curl超时时间
  568. $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  569. }
  570.  
  571. /**
  572. * 生成接口参数xml
  573. */
  574. function createXml()
  575. {
  576. try
  577. {
  578. if($this->parameters["long_url"] == null )
  579. {
  580. throw new SDKRuntimeException("短链接转换接口中,缺少必填参数long_url!"."<br>");
  581. }
  582. $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  583. $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  584. $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
  585. $this->parameters["sign"] = $this->getSign($this->parameters);//签名
  586. return $this->arrayToXml($this->parameters);
  587. }catch (SDKRuntimeException $e)
  588. {
  589. die($e->errorMessage());
  590. }
  591. }
  592.  
  593. /**
  594. * 获取prepay_id
  595. */
  596. function getShortUrl()
  597. {
  598. $this->postXml();
  599. $prepay_id = $this->result["short_url"];
  600. return $prepay_id;
  601. }
  602.  
  603. }
  604.  
  605. /**
  606. * 响应型接口基类
  607. */
  608. class Wxpay_server_pub extends Common_util_pub
  609. {
  610. public $data;//接收到的数据,类型为关联数组
  611. var $returnParameters;//返回参数,类型为关联数组
  612.  
  613. /**
  614. * 将微信的请求xml转换成关联数组,以方便数据处理
  615. */
  616. function saveData($xml)
  617. {
  618. $this->data = $this->xmlToArray($xml);
  619. }
  620.  
  621. function checkSign()
  622. {
  623. $tmpData = $this->data;
  624. unset($tmpData['sign']);
  625. $sign = $this->getSign($tmpData);//本地签名
  626. if ($this->data['sign'] == $sign) {
  627. return TRUE;
  628. }
  629. return FALSE;
  630. }
  631.  
  632. /**
  633. * 获取微信的请求数据
  634. */
  635. function getData()
  636. {
  637. return $this->data;
  638. }
  639.  
  640. /**
  641. * 设置返回微信的xml数据
  642. */
  643. function setReturnParameter($parameter, $parameterValue)
  644. {
  645. $this->returnParameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  646. }
  647.  
  648. /**
  649. * 生成接口参数xml
  650. */
  651. function createXml()
  652. {
  653. return $this->arrayToXml($this->returnParameters);
  654. }
  655.  
  656. /**
  657. * 将xml数据返回微信
  658. */
  659. function returnXml()
  660. {
  661. $returnXml = $this->createXml();
  662. return $returnXml;
  663. }
  664. }
  665.  
  666. /**
  667. * 通用通知接口
  668. */
  669. class Notify_pub extends Wxpay_server_pub
  670. {
  671.  
  672. }
  673.  
  674. /**
  675. * 请求商家获取商品信息接口
  676. */
  677. class NativeCall_pub extends Wxpay_server_pub
  678. {
  679. /**
  680. * 生成接口参数xml
  681. */
  682. function createXml()
  683. {
  684. if($this->returnParameters["return_code"] == "SUCCESS"){
  685. $this->returnParameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  686. $this->returnParameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  687. $this->returnParameters["nonce_str"] = $this->createNoncestr();//随机字符串
  688. $this->returnParameters["sign"] = $this->getSign($this->returnParameters);//签名
  689. }
  690. return $this->arrayToXml($this->returnParameters);
  691. }
  692.  
  693. /**
  694. * 获取product_id
  695. */
  696. function getProductId()
  697. {
  698. $product_id = $this->data["product_id"];
  699. return $product_id;
  700. }
  701.  
  702. }
  703.  
  704. /**
  705. * 静态链接二维码
  706. */
  707. class NativeLink_pub extends Common_util_pub
  708. {
  709. var $parameters;//静态链接参数
  710. var $url;//静态链接
  711.  
  712. function __construct()
  713. {
  714. }
  715.  
  716. /**
  717. * 设置参数
  718. */
  719. function setParameter($parameter, $parameterValue)
  720. {
  721. $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  722. }
  723.  
  724. /**
  725. * 生成Native支付链接二维码
  726. */
  727. function createLink()
  728. {
  729. try
  730. {
  731. if($this->parameters["product_id"] == null)
  732. {
  733. throw new SDKRuntimeException("缺少Native支付二维码链接必填参数product_id!"."<br>");
  734. }
  735. $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
  736. $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
  737. $time_stamp = time();
  738. $this->parameters["time_stamp"] = "$time_stamp";//时间戳
  739. $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
  740. $this->parameters["sign"] = $this->getSign($this->parameters);//签名
  741. $bizString = $this->formatBizQueryParaMap($this->parameters, false);
  742. $this->url = "weixin://wxpay/bizpayurl?".$bizString;
  743. }catch (SDKRuntimeException $e)
  744. {
  745. die($e->errorMessage());
  746. }
  747. }
  748.  
  749. /**
  750. * 返回链接
  751. */
  752. function getUrl()
  753. {
  754. $this->createLink();
  755. return $this->url;
  756. }
  757. }
  758.  
  759. /**
  760. * JSAPI支付——H5网页端调起支付接口
  761. */
  762. class JsApi_pub extends Common_util_pub
  763. {
  764. var $code;//code码,用以获取openid
  765. var $openid;//用户的openid
  766. var $parameters;//jsapi参数,格式为json
  767. var $prepay_id;//使用统一支付接口得到的预支付id
  768. var $curl_timeout;//curl超时时间
  769.  
  770. function __construct()
  771. {
  772. //设置curl超时时间
  773. $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  774. }
  775.  
  776. /**
  777. * 作用:生成可以获得code的url
  778. */
  779. function createOauthUrlForCode($redirectUrl)
  780. {
  781. $urlObj["appid"] = WxPayConf_pub::APPID;
  782. $urlObj["redirect_uri"] = "$redirectUrl";
  783. $urlObj["response_type"] = "code";
  784. $urlObj["scope"] = "snsapi_base";
  785. $urlObj["state"] = "STATE"."#wechat_redirect";
  786. $bizString = $this->formatBizQueryParaMap($urlObj, false);
  787. return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
  788. }
  789.  
  790. /**
  791. * 作用:生成可以获得openid的url
  792. */
  793. function createOauthUrlForOpenid()
  794. {
  795. $urlObj["appid"] = WxPayConf_pub::APPID;
  796. $urlObj["secret"] = WxPayConf_pub::APPSECRET;
  797. $urlObj["code"] = $this->code;
  798. $urlObj["grant_type"] = "authorization_code";
  799. $bizString = $this->formatBizQueryParaMap($urlObj, false);
  800. return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
  801. }
  802.  
  803. /**
  804. * 作用:通过curl向微信提交code,以获取openid
  805. */
  806. function getOpenid()
  807. {
  808. $url = $this->createOauthUrlForOpenid();
  809. //初始化curl
  810. $ch = curl_init();
  811. //设置超时
  812. curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
  813. curl_setopt($ch, CURLOPT_URL, $url);
  814. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  815. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
  816. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  817. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  818. //运行curl,结果以jason形式返回
  819. $res = curl_exec($ch);
  820. curl_close($ch);
  821. //取出openid
  822. $data = json_decode($res,true);
  823. $this->openid = $data['openid'];
  824. return $this->openid;
  825. }
  826.  
  827. /**
  828. * 作用:设置prepay_id
  829. */
  830. function setPrepayId($prepayId)
  831. {
  832. $this->prepay_id = $prepayId;
  833. }
  834.  
  835. /**
  836. * 作用:设置code
  837. */
  838. function setCode($code_)
  839. {
  840. $this->code = $code_;
  841. }
  842.  
  843. /**
  844. * 作用:设置jsapi的参数
  845. */
  846. public function getParameters()
  847. {
  848. $jsApiObj["appId"] = WxPayConf_pub::APPID;
  849. $timeStamp = time();
  850. $jsApiObj["timeStamp"] = "$timeStamp";
  851. $jsApiObj["nonceStr"] = $this->createNoncestr();
  852. $jsApiObj["package"] = "prepay_id=$this->prepay_id";
  853. $jsApiObj["signType"] = "MD5";
  854. $jsApiObj["paySign"] = $this->getSign($jsApiObj);
  855. $this->parameters = json_encode($jsApiObj);
  856.  
  857. return $this->parameters;
  858. }
  859. }
  860. ?>

  

WeMall - 开源微商城 微信商城 商城源码 分销商城 b2b2c商城系统

wemall官网地址:http://www.wemallshop.com

wemall app商城源码Android之Native(原生)支付模式一demo的更多相关文章

  1. wemall app商城源码Android之支付宝通知处理类

    wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之处 ...

  2. wemall app商城源码Android之支付宝接口公用函数

    wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之  ...

  3. wemall app商城源码Android数据的SharedPreferences储存方式

    wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android数据 ...

  4. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  5. wemall app商城源码Android 获取XML网络数据并绑定到ListView

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享Android 获取XML网络数据并绑定到Li ...

  6. wemall app商城源码Android中ViewHolder详细解释

    1.ViewHolder的解释: (1).只是一个静态类,不是Android的API方法. (2).它的作用就在于减少不必要的调用findViewById,然后把对底下的控件引用存在ViewHolde ...

  7. wemall app商城源码Android短信监听接收器

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  8. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

  9. wemall app商城源码机器人检测

    wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之 ...

随机推荐

  1. HTML5 Canvas、内联 SVG、Canvas vs. SVG

    canvas 元素用于在网页上绘制图形. 什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canv ...

  2. Bootstrap相关的网站

    http://www.bootcss.com/ http://expo.bootcss.com/ http://www.webresourcesdepot.com/20-beautiful-resou ...

  3. CCNA网络工程师学习进程(9)GNS3的安装与配置

        本节将简单介绍一下网络设备模拟软件GNS3的配置和使用方法.     (1)GNS3概述: GNS3是一款具有图形化界面可以运行在多平台(包括Windows, Linux, and MacOS ...

  4. vue.js中ajax请求

    <div id="app"> <table style="border-collapse: collapse"> <thead&g ...

  5. 使用OpenFiler来模拟存储配置RAC中ASM共享盘及多路径(multipath)的测试

    第一章 本篇总览 之前发布了一篇<Oracle_lhr_RAC 12cR1安装>,但是其中的存储并没有使用多路径,而是使用了VMware自身提供的存储.所以,年前最后一件事就是把多路径学习 ...

  6. 【初码干货】关于.NET玩爬虫这些事

    这几天在微信群里又聊到.NET可以救中国但是案例太少不深的问题,我说.NET玩爬虫简直就是宇宙第一,于是大神朱永光说,你为何不来写一篇总结一下? 那么今天就全面的来总结一下,在.NET生态下,如何玩爬 ...

  7. yum安装CDH5.5 Hadoop集群

    1.环境说明 系统环境: 系统环境:centos6.7 Hadoop版本:CDH5.5 JDK运行版本:1.7.0_67 集群各节点组件分配: 2.准备工作 安装 Hadoop 集群前先做好下面的准备 ...

  8. Disruptor深入解读

    将系统性能优化到极致,永远是程序爱好者所努力的一个方向.在java并发领域,也有很多的实践与创新,小到乐观锁.CAS,大到netty线程模型.纤程Quasar.kilim等.Disruptor是一个轻 ...

  9. java_ 集合

    集合类说明及区别Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap ...

  10. 地图学与GIS制图的基础理论(二)

    利用GIS技术进行地图制图,其最终目标还是需要回到地图学中去.地图学中关于地图制作的经典要求,有以下几点: 地图必须要与现实相符,符合人类的感知 这点是地图最基本的一条,地图的每一个要素展现的都是跟现 ...