1. 接入的是shopnc,代码改改就可以用了,虽然不是一个完善的类,也可以按照类的方法直接调用,省得再去扣开发文档 农行在接收返回信息也会验证一次,还有一点就是页面通知返回结果
  2.  
  3. 一定要用服务器通知,不然会出异常问题,导致问题
  1. 201651211:15:41

  大概有一下几个文件,

  1. <?php
  2.  
  3. class abchina{
  4.  
  5. //农行网关
  6. const GATEWAY = 'https://pay.abchina.com/ebus/trustpay/ReceiveMerchantTrxReqServlet';
  7. //标示
  8. private $code = 'abchina';
  9.  
  10. /**
  11. * 支付接口配置信息
  12. *
  13. * @var array
  14. */
  15. private $payment;
  16. /**
  17. * 订单信息
  18. *
  19. * @var array
  20. */
  21. private $order;
  22. /**
  23. * 发送至农行的参数
  24. *
  25. * @var array
  26. */
  27. private $parameter;
  28.  
  29. //发送请求
  30. private $request;
  31.  
  32. //订单数据
  33. private $orderitems;
  34.  
  35. private $payment_info;
  36. private $order_info;
  37. private $res;
  38.  
  39. //签名算法
  40. const SIGNATURE_ALGORITHM = 'SHA1withRSA';
  41.  
  42. //商户编号
  43. const MERCHANTID = '';
  44.  
  45. //商户私钥加密密码
  46. const MERCHANTCERTPASSWORD = '';
  47.  
  48. //网上支付平台证书
  49. const TRUSTPAYCERTFILE= './TrustPay.cer';
  50.  
  51. //商户证书储存目录档名
  52. const MERCHANTCERTFILE= './fuwuqi.pfx';
  53.  
  54. //报文里有的东西
  55. const TRX_TYPE_PAY_REQ = "PayReq";
  56. public function __construct($payment_info = array(),$order_info = array()) {
  57. $this->payment_info = $payment_info;
  58. $this->order_info = $order_info;
  59.  
  60. }
  61.  
  62. //提交订单
  63. public function submit() {
  64.  
  65. // var_dump($this->payment_info);
  66. //
  67. // var_dump($this->order_info);
  68. // die;
  69.  
  70. //没有自己传参的不要随意修改
  71.  
  72. $this->order["PayTypeID"] = 'ImmediatePay'; //设定交易类型
  73. $this->order["OrderNo"] = $this->order_info['pay_sn']; //设定订单编号 自己传参数
  74. $this->order["OrderAmount"] = $this->order_info['api_pay_amount']; //设定交易金额 自己传参数
  75. // $this->order["OrderAmount"] = '0.01'; //设定交易金额 自己传参数 测试使用
  76. $this->order["CurrencyCode"] = 156; //设定交易币种
  77. $this->order["InstallmentMark"] = 0; //分期标识
  78. $this->order["OrderDate"] = date('Y/m/d'); //设定订单日期 (必要信息 - YYYY/MM/DD)
  79. $this->order["OrderTime"] = date('H:i:s'); //设定订单时间 (必要信息 - HH:MM:SS)
  80. $this->order["CommodityType"] = '0202'; //设置商品种类
  81.  
  82. //2、订单明细
  83. $orderitem = array ();
  84. $orderitem["ProductName"] = "GG"; //商品名称 自己写随意
  85. $this->orderitems[0] = $orderitem;
  86.  
  87. //3、生成支付请求对象
  88. $this->request["TrxType"] = self::TRX_TYPE_PAY_REQ; //设定交易类型
  89. $this->request["PaymentType"] = 'A'; //设定支付类型
  90. $this->request["PaymentLinkType"] = 1; //设定支付接入方式
  91. $this->request["NotifyType"] = 1; //设定通知方式
  92. $this->request["ResultNotifyURL"] = SHOP_SITE_URL."/api/payment/abchina/notify_url.php"; //设定通知URL地址 自己设定
  93. $this->request["IsBreakAccount"] = 0; //设定交易是否分账
  94.  
  95. $aMerchantNo =1;
  96. //取得交易报文
  97. $tRequestMessage = $this->getRequestMessage();
  98.  
  99. // echo '<pre>';
  100. // var_export($tRequestMessage);
  101. // echo '</pre>';
  102. // die;
  103. //组成完整交易报文
  104. $tRequestMessage = $this->composeRequestMessage($aMerchantNo,$tRequestMessage);
  105.  
  106. // echo '<pre>';
  107. // var_export($tRequestMessage);
  108. // echo '</pre>';
  109. // die;
  110. //对交易报文进行签名
  111. $tRequestMessage = $this->signMessage($aMerchantNo, $tRequestMessage);
  112. // echo '<pre>';
  113. // var_export($tRequestMessage);
  114. // echo '</pre>';
  115. // die;
  116. //发送交易报文至网上支付平台
  117. $tResponseMessage = $this->sendMessage($aMerchantNo,$tRequestMessage);
  118.  
  119. //验证网上支付平台响应报文的签名
  120. $this->res = $this->verifySign($tResponseMessage);
  121.  
  122. // echo '<pre>';
  123. // var_export($tResponseMessage);
  124. // echo '</pre>';
  125.  
  126. $PaymentURL = self::GetValue($tResponseMessage,'PaymentURL') ;
  127. $ReturnCode = self::GetValue($tResponseMessage,'ReturnCode') ;
  128.  
  129. //验证报文签名正确而却返回码是0000,就可以跳转支付页面
  130. if($this->res == 1 && $ReturnCode=='0000' ){
  131.  
  132. header("Location:".$PaymentURL);
  133. die;
  134. }else{
  135. header('<meta http-equiv="content-type" content="text/html;charset=utf-8">');
  136. die('abchina pay check error');
  137.  
  138. }
  139.  
  140. // var_dump($PaymentURL);
  141. //
  142. // var_dump($ReturnCode);
  143. // echo '<pre>';
  144. // var_export(json_decode($tResponseMessage,true));
  145. // echo '</pre>';
  146.  
  147. // var_dump($res);
  148. // die;
  149.  
  150. }
  151.  
  152. public static function arrayRecursive(&$array, $function, $apply_to_keys_also = false){
  153. foreach ($array as $key => $value)
  154. {
  155. $array[$key] = $function($value);
  156. }
  157. }
  158. protected function getRequestMessage() {
  159. self :: arrayRecursive($this->order, "urlencode", false);
  160. self :: arrayRecursive($this->request, "urlencode", false);
  161. $js = '"Order":' . (json_encode(($this->order)));
  162. $js = substr($js, 0, -1);
  163. $js = $js . ',"OrderItems":[';
  164. $count = count($this->orderitems, COUNT_NORMAL);
  165. for ($i = 0; $i < $count; $i++) {
  166. self :: arrayRecursive($this->orderitems[$i], "urlencode", false);
  167. $js = $js . json_encode($this->orderitems[$i]);
  168. if ($i < $count -1) {
  169. $js = $js . ',';
  170. }
  171. }
  172. $js = $js . ']}}';
  173. $tMessage = json_encode($this->request);
  174. $tMessage = substr($tMessage, 0, -1);
  175. $tMessage = $tMessage . ',' . $js;
  176. $tMessage = urldecode($tMessage);
  177. return $tMessage;
  178.  
  179. }
  180.  
  181. private function composeRequestMessage($aMerchantNo,$aMessage) {
  182. $tMessage = "{\"Version\":\"V3.0.0\",\"Format\":\"JSON\",\"Merchant\":" . "{\"ECMerchantType\":\"" . "EBUS" . "\",\"MerchantID\":\"" . self::MERCHANTID . "\"}," . "\"TrxRequest\":" . $aMessage . "}";
  183. return $tMessage;
  184. }
  185.  
  186. private function signMessage($aMerchantNo, $aMessage) {
  187. // public function signMessageOp() {
  188.  
  189. //1、读取证书
  190.  
  191. // $tTrustPayCertFile = dirname(__FILE__).'/TrustPay.cer';
  192. $tTrustPayCertFile = "fuwuqi.pfx";
  193. // $iTrustpayCertificate = openssl_x509_read(self :: der2pem(file_get_contents($tTrustPayCertFile)));
  194.  
  195. // var_dump($tTrustPayCertFile);
  196. // var_dump(self::MERCHANTCERTPASSWORD);
  197. // die;
  198.  
  199. openssl_pkcs12_read(file_get_contents($tTrustPayCertFile), $tCertificate, self::MERCHANTCERTPASSWORD);
  200.  
  201. // var_dump($tCertificate);
  202. // die;
  203.  
  204. //2、验证证书是否在有效期内
  205. $cer = openssl_x509_parse($tCertificate['cert']);
  206. // var_dump($cer);
  207. //3、取得密钥
  208. $pkey = openssl_pkey_get_private($tCertificate['pkey']);
  209. // var_dump($pkey);
  210.  
  211. $key = $pkey;
  212. // $key = self :: $iMerchantKeys[$aMerchantNo -1];
  213. $signature = '';
  214. $data = strval($aMessage);
  215. if (!openssl_sign($data, $signature, $key, OPENSSL_ALGO_SHA1)) {
  216. return null;
  217. }
  218. $signature = base64_encode($signature);
  219. $tMessage = "{\"Message\":$data" . "," . '"Signature-Algorithm":' . '"' . self :: SIGNATURE_ALGORITHM . '","Signature":"' . $signature . '"}';
  220. return $tMessage;
  221.  
  222. // return $pkey;
  223. // var_dump($iTrustpayCertificate);
  224. }
  225.  
  226. private function sendMessage($aMerchantNo, $aMessage) {
  227. //组成<MSG>段
  228. $tMessage = strval($aMessage);
  229. $tURL = self::GATEWAY;
  230. $opts = array(
  231. 'http' => array(
  232. 'method' => 'POST',
  233. 'user_agent' => 'TrustPayClient V3.0.0',
  234. 'protocol_version' => 1.0,
  235. 'header' => array('Content-Type: text/html', 'Accept: */*'),
  236. 'content' => $tMessage
  237. ),
  238. 'ssl' => array(
  239. 'verify_peer' => false
  240. )
  241. );
  242.  
  243. $context = stream_context_create($opts);
  244. $tResponseMessage = file_get_contents($tURL, false, $context);
  245.  
  246. // $tTrxResponse = self::init($tResponseMessage);
  247.  
  248. return $tResponseMessage;
  249.  
  250. }
  251.  
  252. private static function der2pem($der_data) {
  253. $pem = chunk_split(base64_encode($der_data), 64, "\n");
  254. $pem = "-----BEGIN CERTIFICATE-----\n" . $pem . "-----END CERTIFICATE-----\n";
  255. return $pem;
  256. }
  257.  
  258. public static function verifySign($aMessage) {
  259.  
  260. $TrustPayFile = "TrustPay.cer";
  261.  
  262. $iTrustpayCertificate = openssl_x509_read(self :: der2pem(file_get_contents($TrustPayFile)));
  263.  
  264. $tTrxResponse = self::GetValue($aMessage,'Message') ;
  265.  
  266. $tSignBase64 = self::GetValue($aMessage,'Signature') ;
  267.  
  268. $tSign = base64_decode($tSignBase64);
  269. $key = openssl_pkey_get_public($iTrustpayCertificate);
  270. $data = strval($tTrxResponse);
  271.  
  272. return openssl_verify($data, $tSign, $key, OPENSSL_ALGO_SHA1);
  273.  
  274. }
  275.  
  276. public function GetValue($json,$aTag)
  277. {
  278. $json = $json;
  279. $index = 0;
  280. $length = 0;
  281. $index = strpos($json, $aTag, 0);
  282. if ($index === false)
  283. return "";
  284. do
  285. {
  286. if($json[$index-1] === "\"" && $json[$index+strlen($aTag)] === "\"")
  287. {
  288. break;
  289. }
  290. else
  291. {
  292. $index = strpos($json, $aTag, $index+1);
  293. if ($index === false)
  294. return "";
  295. }
  296. } while (true);
  297. $index = $index + strlen($aTag) + 2;
  298. $c = $json[$index];
  299. if ($c === '{')
  300. {
  301. $output = self::GetObjectValue($index, $json);
  302. }
  303. if ($c === '"')
  304. {
  305. $output = self::GetStringValue($index, $json);
  306. }
  307. return $output;
  308. }
  309. private function GetObjectValue($index, $json)
  310. {
  311. $count = 0;
  312. $_output = "";
  313. do
  314. {
  315. $c = $json[$index];
  316. if ($c === '{')
  317. {
  318. $count++;
  319. }
  320. if ($c === '}')
  321. $count--;
  322.  
  323. if ($count !== 0)
  324. {
  325. $_output =$_output.$c;
  326. }
  327. else
  328. {
  329. $_output = $_output.$c;
  330. return $_output;
  331. }
  332. $index++;
  333. } while (true);
  334. }
  335.  
  336. private function GetStringValue($index, $json)
  337. {
  338. $index++;
  339. $_output = "";
  340. do
  341. {
  342. $c = $json[$index++];
  343. if ($c !== '"')
  344. {
  345. $_output = $_output.$c;
  346. }
  347. else
  348. {
  349. return $_output;
  350. }
  351.  
  352. } while (true);
  353. }
  354.  
  355. /**
  356. * 返回地址验证(同步)
  357. *
  358. * @param
  359. * @return boolean
  360. */
  361. public function return_verify(){
  362.  
  363. $this->order["PayTypeID"] = 'ImmediatePay'; //设定交易类型
  364. $this->order["OrderNo"] = $this->order_info['pay_sn']; //设定订单编号 自己传参数
  365. $this->order["OrderAmount"] = $this->order_info['api_pay_amount']; //设定交易金额 自己传参数
  366. // $this->order["OrderAmount"] = '0.01'; //设定交易金额 自己传参数 测试使用
  367. $this->order["CurrencyCode"] = 156; //设定交易币种
  368. $this->order["InstallmentMark"] = 0; //分期标识
  369. $this->order["OrderDate"] = date('Y/m/d'); //设定订单日期 (必要信息 - YYYY/MM/DD)
  370. $this->order["OrderTime"] = date('H:i:s'); //设定订单时间 (必要信息 - HH:MM:SS)
  371. $this->order["CommodityType"] = '0202'; //设置商品种类
  372.  
  373. //2、订单明细
  374. $orderitem = array ();
  375. $orderitem["ProductName"] = "GG"; //商品名称 自己写随意
  376. $this->orderitems[0] = $orderitem;
  377.  
  378. //3、生成支付请求对象
  379. $this->request["TrxType"] = self::TRX_TYPE_PAY_REQ; //设定交易类型
  380. $this->request["PaymentType"] = 'A'; //设定支付类型
  381. $this->request["PaymentLinkType"] = 1; //设定支付接入方式
  382. $this->request["NotifyType"] = 1; //设定通知方式
  383. $this->request["ResultNotifyURL"] = SHOP_SITE_URL."/api/payment/abchina/notify_url.php"; //设定通知URL地址 自己设定
  384. $this->request["IsBreakAccount"] = 0; //设定交易是否分账
  385.  
  386. $aMerchantNo =1;
  387. //取得交易报文
  388. $tRequestMessage = $this->getRequestMessage();
  389.  
  390. //组成完整交易报文
  391. $tRequestMessage = $this->composeRequestMessage($aMerchantNo,$tRequestMessage);
  392.  
  393. //对交易报文进行签名
  394. $tRequestMessage = $this->signMessage($aMerchantNo, $tRequestMessage);
  395.  
  396. //发送交易报文至网上支付平台
  397. $tResponseMessage = $this->sendMessage($aMerchantNo,$tRequestMessage);
  398.  
  399. //验证网上支付平台响应报文的签名
  400. $this->res = $this->verifySign($tResponseMessage);
  401.  
  402. $PaymentURL = self::GetValue($tResponseMessage,'PaymentURL') ;
  403. $ReturnCode = self::GetValue($tResponseMessage,'ReturnCode') ;
  404.  
  405. //验证报文签名正确而却返回码是0000,就可以跳转支付页面
  406. if($this->res == 1){
  407. return true;
  408. }else{
  409. return false;
  410. }
  411.  
  412. }
  413.  
  414. public function getPayResult($param){
  415. return $this->res;
  416. }
  417. }

  

abchina.php

notify.php

  1. <?php
  2.  
  3. error_reporting(7);
  4.  
  5. function der2pem($der_data) {
  6. $pem = chunk_split(base64_encode($der_data), 64, "\n");
  7. $pem = "-----BEGIN CERTIFICATE-----\n" . $pem . "-----END CERTIFICATE-----\n";
  8. return $pem;
  9. }
  10.  
  11. //$tt = json_decode(json_encode((array) simplexml_load_string(base64_decode($_POST['MSG']))), true);
  12.  
  13. function verifySignXML($aMessage) {
  14. include dirname(__FILE__)."/XMLDocument.php";
  15. $TrustPayFile = dirname(__FILE__)."/TrustPay.cer";
  16.  
  17. $iTrustpayCertificate = openssl_x509_read(der2pem(file_get_contents($TrustPayFile)));
  18.  
  19. $aMessage = new XMLDocument($aMessage);
  20.  
  21. $tTrxResponse = $aMessage->getValue('Message');
  22.  
  23. $tSignBase64 = $aMessage->getValue('Signature');
  24.  
  25. $tSign = base64_decode($tSignBase64);
  26. $key = openssl_pkey_get_public($iTrustpayCertificate);
  27. $data = strval($tTrxResponse);
  28. $result['res'] = openssl_verify($data, $tSign, $key, OPENSSL_ALGO_SHA1);
  29. $result['iRspRef'] =$aMessage->getValue('iRspRef'); //交易流水号
  30. $result['OrderNo'] =$aMessage->getValue('OrderNo'); //网站交易订单号
  31. $result['Amount'] =$aMessage->getValue('Amount'); //订单金额
  32. $result['VoucherNo'] =$aMessage->getValue('VoucherNo');
  33.  
  34. return $result;
  35.  
  36. }
  37.  
  38. $rr = verifySignXML(base64_decode($_POST['MSG']));
  39. //var_dump($rr);
  40. //die;
  41.  
  42. if ($rr['res'] == 1) {
  43.  
  44. $_GET['act'] = 'payment';
  45. $_GET['op'] = 'return';
  46. $_GET['payment_code'] = 'abchina';
  47.  
  48. $_GET['trade_no'] = $rr['iRspRef'];
  49. $_GET['out_trade_no'] = $rr['OrderNo'];
  50. $_GET['bank_total'] = $rr['Amount'];
  51. $_GET['extra_common_param'] = 'real_order';
  52. require_once(dirname(__FILE__).'/../../../index.php');
  53. } else {
  54. die('abchina notify check error');
  55. }

  XMLDocument.php

  1. <?php
  2. class XMLDocument
  3. {
  4. private $iXMLString = '';
  5.  
  6. public function getFirstTagName()
  7. {
  8. $tTagName = null;
  9. $tStartIndex = strpos($this->iXMLString, '<');
  10. $tEndIndex = strpos($this->iXMLString, '>');
  11. if ($tEndIndex > $tStartIndex)
  12. {
  13. $tTagName = substr($this->iXMLString, $tStartIndex + 1, $tEndIndex - ($tStartIndex + 1));
  14. }
  15.  
  16. return $tTagName;
  17. }
  18.  
  19. public function __construct($aXMLString='')
  20. {
  21. $this->init($aXMLString);
  22. }
  23.  
  24. public function init($aXMLString)
  25. {
  26. $this->iXMLString = $aXMLString;
  27. return $this;
  28. }
  29.  
  30. public function __toString()
  31. {
  32. return $this->iXMLString;
  33. }
  34.  
  35. public function getValue($aTag)
  36. {
  37. $tXMLDocument = null;
  38. $tStartIndex = strpos($this->iXMLString, '<'.trim($aTag).'>');
  39. $tEndIndex = strpos($this->iXMLString, '</'.trim($aTag).'>');
  40. if (($tStartIndex !== FALSE) && ($tEndIndex !== FALSE) && ($tStartIndex < $tEndIndex))
  41. {
  42. $tXMLDocument = substr($this->iXMLString, $tStartIndex + strlen($aTag) + 2, $tEndIndex - ($tStartIndex + strlen($aTag) + 2));
  43. }
  44. return $tXMLDocument;
  45. }
  46.  
  47. public function getValueNoNull($aTag)
  48. {
  49. $tValue = "";
  50. $tXML = $this->getValue($aTag);
  51. if ($tXML !== null)
  52. {
  53. $tValue = $tXML;
  54. }
  55. return $tValue;
  56. }
  57.  
  58. public function getValueArray($aTag)
  59. {
  60. $tValues = array();
  61. $offset = 0;
  62. while(TRUE)
  63. {
  64. $tStartIndex = strpos($this->iXMLString, '<'.trim($aTag).'>', $offset);
  65. $tEndIndex = strpos($this->iXMLString, '</'.trim($aTag).'>', $offset);
  66. if (($tStartIndex === FALSE) || ($tEndIndex === FALSE) || ($tStartIndex > $tEndIndex))
  67. {
  68. break;
  69. }
  70. array_push($tValues, new XMLDocument(substr($this->iXMLString, $tStartIndex + strlen($aTag) + 2, $tEndIndex - ($tStartIndex + strlen($aTag) + 2))));
  71. $offset = $tEndIndex + 1;
  72. }
  73. return $tValues;
  74. }
  75.  
  76. public function getValueArrayList($aTag)
  77. {
  78. return $this->getValueArray($aTag);
  79. }
  80.  
  81. public function getDocuments($aTag)
  82. {
  83. return $this->getValueArray($aTag);
  84. }
  85.  
  86. public function getFormatDocument($aSpace)
  87. {
  88. return $this->getFormatDocumentLevel(0, $aSpace);
  89. }
  90.  
  91. private function getFormatDocumentLevel($aLevel, $aSpace)
  92. {
  93. $tSpace1 = str_repeat($aSpace, $aLevel + 1);
  94. $tTagName = $this->getFirstTagName();
  95. if ($tTagName === null)
  96. {
  97. return $this;
  98. }
  99. $tXMLString = "\n";
  100. $tXMLDocument = new XMLDocument($this->iXMLString);
  101. while (($tTagName = $tXMLDocument->getFirstTagName()) !== null)
  102. {
  103. $tTemp = $tXMLDocument->getValue($tTagName);
  104. $tSpace = "";
  105.  
  106. if ($tTemp->getFirstTagName() !== null)
  107. {
  108. $tSpace = $tSpace1;
  109. }
  110. $tXMLString = "$tXMLString$tSpace1<$tTagName>".$tTemp->getFormatDocumentLevel($aLevel + 1, $aSpace)."$tSpace</$tTagName>\n";
  111. $tXMLDocument = $tXMLDocument->deleteFirstTagDocument();
  112.  
  113. }
  114. return new XMLDocument($tXMLString);
  115. }
  116.  
  117. public function deleteFirstTagDocument()
  118. {
  119. $tTagName = $this->getFirstTagName();
  120. $tStartIndex = strpos($this->iXMLString, "<$tTagName>");
  121. $tEndIndex = strpos($this->iXMLString, "</$tTagName>");
  122. if ($tEndIndex > $tStartIndex)
  123. {
  124. $this->iXMLString = substr($this->iXMLString, $tEndIndex + strlen($tTagName) + 3);
  125. if ($this->iXMLString === FALSE)
  126. {
  127. $this->iXMLString = "";
  128. }
  129. }
  130. return $this;
  131. }
  132.  
  133. }
  134.  
  135. ?>

代码包和开发文档说明下载地址 :http://download.csdn.net/detail/zh7314/9517627

便宜没好货你懂的,或者你可以直接复制代码也是可以使用的

农业银行快捷支付php版说明和实例代码的更多相关文章

  1. Android-支付宝快捷支付

    支付宝的快捷支付Android版业务流程比較麻烦,出现的意外情况比較多.在此,简单说下开发流程以及出现错误的解决方式; 1.注冊支付业务.这里不在赘述.建立数据安全传输所须要的私钥公钥,这里採用的是R ...

  2. phonegap支付宝2.0移动快捷支付插件IOS版

    坑爹的支付宝,一两年都没有更新sdk了,这两天突然更新sdk,而且更新的变化特别大,所以只能对之前的支付宝快捷支付插件重新写了一遍. 这样既顺应了支付宝的更新,同时也支持了ios8. 废话少说,集成过 ...

  3. 移动APP 支付宝快捷支付开发流程

    [代码] [Java]代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...

  4. 微信支付开发(1) JS API支付V3版(转)

    http://www.cnblogs.com/txw1958/p/wxpayv3-jsapi.html 本文介绍微信支付下的jsapi实现流程 前言 微信支付现在分为v2版和v3版,2014年9月10 ...

  5. 微信支付java版V3验证数据合法性

    [TOC] 1. 微信支付java版V3验证数据合法性 概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法. 特别提醒:商户系统对于支付结果通知的内容一定 ...

  6. 银联支付java版

    注:本文来源于:<  银联支付java版    > 银联支付java版 2016年09月18日 15:55:20 阅读数:2431 首先去银联官网注册测试支付账户   下载对应的demo[ ...

  7. 「美团外卖APP签约快捷支付」流程体验

    §1 添加银行卡 新用户在美团外卖APP订餐支付时,首先要绑定银行卡.如下是“添加银行卡”页,输入卡号后,系统自动调用卡bin库校验卡号的有效性,如果有效会显示发卡行和卡类型(借记卡/贷记卡).  这 ...

  8. java如何集成支付宝移动快捷支付功能

    项目需要,需要在客户端集成支付宝接口.第一次集成,过程还是挺简单的,不过由于支付宝官方文档写的不够清晰,也是走了一些弯路,下面把过程写出来分享给大家.就研究了一下:因为使用支付宝接口,就需要到支付宝官 ...

  9. Android学习笔记_69_android 支付宝之网页支付和快捷支付

    参考资料: https://b.alipay.com/order/productDetail.htm?productId=2013080604609654 https://b.alipay.com/o ...

随机推荐

  1. PHP 变量声明的意义

    有人说,PHP是没有类型的语言,个人比较倾向于,PHP是弱类型的计算机脚本语言的说法. 计算机存储都是二进制的数据,要么是0,要么是1. 在抽象数据的过程中,是要有各种各样的标志位来识别数据. 虽然, ...

  2. Odd Even Linked List

    Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...

  3. java基本算法之快速排序

    快速排序:是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确 ...

  4. poj2492_A Bug's Life_并查集

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 34947   Accepted: 11459 D ...

  5. Spring 定时器Quartz的用法

    Spring定时器Quartz的用法也很简单,需要引入quartz-all-1.5.2.jar java代码如下: package com.coalmine.desktop; import java. ...

  6. .deb包的安装方法

    deb是Debian linux的安装格式,跟redhat的rpm非常相似,最基本的安装命令是: dpkg -i file.deb dpkg是Debian Package的简写,是为Debian专门开 ...

  7. Java基础之反射和动态代理

    1,反射是依赖于Class对象,然后根据Class对象,去操作该类的资源的.Class对象是发射的基石! 问题1:人这类事物用什么表示?汽车这类事物用什么表示>计算机文件用什么表示?有如此多的事 ...

  8. nuget packages batch install

    d:\nuget\nuget.exe install EnterpriseLibrary.Common -NoCache -Verbosity detailed -OutputDirectory D: ...

  9. Vitamio

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

  10. android tab选项卡的使用

    项目做完了,写写博客,在项目中遇到的一些问题,或者是自己觉得很不错的东西.这一篇主要是想和大家分享一下我在项目中封装的一个东西,就是tab选项卡.先看看效果图: 我在网上看了很多有关选项卡的demo, ...