config_sanxing.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <?php
  2. /**
  3. * Description of config_vivo
  4. * @version
  5. * 1.0.0 Created at 2018-3-3. by --gwang
  6. * @author gwang (mail@wanggangzero.cn)
  7. * @copyright ? 2018-3-3, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  8. */
  9. class config_sanxing {
  10. /**
  11. * @var string 验证登录token接口 URI
  12. */
  13. public $sanxing_api_login = 'https://siapcn1.ipengtai.com/api/oauth/get_token_info';
  14. /**
  15. * @var string 三星后台创建订单接口 URI
  16. */
  17. public $sanxing_api_trade = 'http://siapcn1.ipengtai.com:7002/payapi/order';
  18. //put your code here
  19. /**
  20. * @var string sanxing 后台应用ID
  21. */
  22. public $appId = '500151089';
  23. /**
  24. * @var string 三星平台客户端包名
  25. */
  26. public $packageName = "com.loyalsoft.ylsj.samsung";
  27. /**
  28. * @var string sanxing 后台开发商ID
  29. */
  30. public $cpId = 'a8f45473e4699ba87f96';
  31. /**
  32. * @var string sanxing 后台应用 appkey
  33. */
  34. public $appKey = '3a1090587b91686582f5e3e6ecfe58b0';
  35. //cp公钥 公钥
  36. public $cppkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwDqNB3fC2FbmINIIOKq/4EjEqHnxlox2A4XybCGHAz1hwbthNKjYlIukmoQ0SKc3x7lmP0i9JBD3QHec1qve2BIdnzEIM1I5SfNAvinekMIFH7ECrqxReeHt4KlzBQdNZ8VdK0zxeeOTBAdaJJVlqS5ExS8F917rSClpMSevoBQIDAQAB";
  37. /**
  38. * @var type cp私钥
  39. */
  40. public $cpvkey = "MIICXAIBAAKBgQCmzt5jLDQh59ynaO/ypcSMXvPPrZ6bN5Stv1kiGOd4rO9tYhMjZAXNXohMYCfKahzgO1LKrg5F+XQ9AXmBkwYvcsUPOiKzXG7TCUyUUNatf6mWowK5Suwr6fzBBzmbOf4ZgAGMrHT6UCRe8XocmbmqFZ+1KG53HSdfhjcGxTDDHwIDAQABAoGAB52KKZzrBGFBgaMY0UsgHgh3uROEGjH/Z69EsnnQl4HNrIC9vu/iE+4s6s+5AVS23MXYkchAfpFU7TQUCAZeUdkFFyLtjHqBep75jKkVhOgKIYlKbTmfJCNcFWSf16d4KYLbHKK2wcHOWvD/YC04HILjErboFRQktG7sBm1/SoECQQD6DcgRl43Fn/f2Q2jf9jqQwc/Yx9TSAEkMMWiIofSDLAydHiH9oFs5Pw27WubIN9pQCH6DMirXQwgN5nyBXQbtAkEAqsZSyw1AR5Trdp1ktoIpN4s8OtUHuDSiT2apNDgkCPmqvuYyvZlfYi4m1AqTM11irlp/t3o+5/bGDCAq/YUEuwJBAJfUIGPWIuYZMKVd3uMGDh9xHvPgui9crv3xTiiQNfgjmfEYp8jpQhqrV3ooQrLVfwBTeAXPQ0X7VHukNHsT8i0CQDF10SLYCqbwvaWT/khRuGhK3j3X1y2FqQDAJf9mxyEGVmqFt2psUlDYNwywp2N4B42hzl2wfSmnskJuyqS0cuMCQCwg0tWcYjhFKmu1deNxTgaP6C3hNO9b3yD9+EbbRCsEPR2TrreG8iVW9mu5PEyIo5h6Ty2CFxEY+vxCMvtGpWE=";
  41. /**
  42. * @var type 平台公钥
  43. */
  44. public $platpkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCBD5ksV+NwPjC2X/zKbFRl6J0zFyYV6Zb210FeD5XaPEuAysdo4T54eEh425z5z62nkgJ7Qwkd6pgSNgSOcnAVBfuHn3B9i9sQtwSSMpxt+EhaZBIv5YoR7yFUApjSBnQ6pdizlOIyIs7+fYecQYiBiVf7Txu75T85gl+kFwhbswIDAQAB";
  45. /**
  46. * 从product_id获得三星后台商品ID
  47. * @param type $product_id
  48. * @return string
  49. */
  50. function getWaresid($product_id) {
  51. $arr = array(
  52. '801801' => 1,
  53. '801802' => 2,
  54. '801803' => 3,
  55. '801804' => 4,
  56. '801805' => 5,
  57. '801806' => 6
  58. );
  59. return $arr[$product_id];
  60. }
  61. /**
  62. * 从三星后台商品ID转到product_id
  63. * @param type $samsungWaresid
  64. * @return string
  65. */
  66. function getProductId($samsungWaresid) {
  67. $itemMap = array(
  68. '1' => '801801',
  69. '2' => '801802',
  70. '3' => '801803',
  71. '4' => '801804',
  72. '5' => '801805',
  73. '6' => '801806'
  74. );
  75. return $itemMap[$samsungWaresid];
  76. }
  77. /**
  78. *
  79. * @return \config_vivo
  80. */
  81. static public function Inst() {
  82. return new config_sanxing();
  83. }
  84. /** 格式化公钥
  85. * $pubKey PKCS#1格式的公钥串
  86. * return pem格式公钥, 可以保存为.pem文件
  87. */
  88. static function formatPubKey($pubKey) {
  89. $fKey = "-----BEGIN PUBLIC KEY-----\n";
  90. $len = strlen($pubKey);
  91. for ($i = 0; $i < $len;
  92. ) {
  93. $fKey = $fKey . substr($pubKey, $i, 64) . "\n";
  94. $i += 64;
  95. }
  96. $fKey .= "-----END PUBLIC KEY-----";
  97. return $fKey;
  98. }
  99. /** 格式化公钥
  100. * $priKey PKCS#1格式的私钥串
  101. * return pem格式私钥, 可以保存为.pem文件
  102. */
  103. static function formatPriKey($priKey) {
  104. $fKey = "-----BEGIN RSA PRIVATE KEY-----\n";
  105. $len = strlen($priKey);
  106. for ($i = 0; $i < $len;
  107. ) {
  108. $fKey = $fKey . substr($priKey, $i, 64) . "\n";
  109. $i += 64;
  110. }
  111. $fKey .= "-----END RSA PRIVATE KEY-----";
  112. return $fKey;
  113. }
  114. /** RSA签名
  115. * $data待签名数据
  116. * $priKey商户私钥
  117. * 签名用商户私钥
  118. * 使用MD5摘要算法
  119. * 最后的签名,需要用base64编码
  120. * return Sign签名
  121. */
  122. static function sign($data, $priKey) {
  123. $res = openssl_get_privatekey($priKey); //转换为openssl密钥
  124. openssl_sign($data, $sign, $res, OPENSSL_ALGO_MD5); //调用openssl内置签名方法,生成签名$sign
  125. openssl_free_key($res); //释放资源
  126. $sign = base64_encode($sign); //base64编码
  127. return $sign;
  128. }
  129. /** RSA验签
  130. * $data待签名数据
  131. * $sign需要验签的签名
  132. * $pubKey爱贝公钥
  133. * 验签用爱贝公钥,摘要算法为MD5
  134. * return 验签是否通过 bool值
  135. */
  136. static function verify($data, $sign, $pubKey) {
  137. $res = openssl_get_publickey($pubKey); //转换为openssl格式密钥
  138. $result = (bool) openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_MD5); //调用openssl内置方法验签,返回bool值
  139. openssl_free_key($res); //释放资源
  140. return $result; //返回资源是否成功
  141. }
  142. /**
  143. * 组装request报文
  144. * $reqJson 需要组装的json报文
  145. * $vkey cp私钥,格式化之前的私钥
  146. * return 返回组装后的报文
  147. */
  148. function composePayReq($reqJson) {
  149. $content = json_encode($reqJson); # 获取待签名字符串
  150. $vkey = self::formatPriKey($this->cpvkey); # 格式化key,建议将格式化后的key保存,直接调用
  151. $sign = self::sign($content, $vkey); # 生成签名
  152. $reqData = "transdata=" . urlencode($content) . "&sign=" . urlencode($sign) . "&signtype=RSA"; //组装请求报文,目前签名方式只支持RSA这一种s
  153. return $reqData;
  154. }
  155. /**
  156. * 组装request报文
  157. * $reqJson 需要组装的json报文
  158. * $vkey cp私钥,格式化之前的私钥
  159. * return 返回组装后的报文
  160. */
  161. function composeReq($data) {
  162. $vkey = self::formatPriKey($this->cpvkey); # 格式化key,建议将格式化后的key保存,直接调用
  163. ksort($data);
  164. $content = loyalsoft\HttpUtil::makeQueryString($data);
  165. $sign = self::sign($content, $vkey); # 生成签名
  166. $reqData = $content . "&sign=" . urlencode($sign); # 组装请求报文,目前签名方式只支持RSA这一种s
  167. return $reqData;
  168. }
  169. /**
  170. * 解析response报文
  171. * $content 收到的response报文
  172. * $pkey 爱贝平台公钥,用于验签
  173. * $respJson 返回解析后的json报文
  174. * return 解析成功TRUE,失败FALSE
  175. */
  176. function parseResp($content, &$respJson) {
  177. $arr = array_map(create_function('$v', 'return explode("=", $v);'), explode('&', $content));
  178. foreach ($arr as $value) {
  179. $resp[($value[0])] = urldecode($value[1]);
  180. }
  181. if (array_key_exists("transdata", $resp)) { //解析transdata
  182. $respJson = json_decode($resp["transdata"]);
  183. } else {
  184. return FALSE;
  185. }
  186. if (array_key_exists("sign", $resp)) { //验证签名,失败应答报文没有sign,跳过验签
  187. $pkey = self::formatPubKey($this->platpkey); //校验签名
  188. return self::verify($resp["transdata"], $resp["sign"], $pkey);
  189. } else if (!array_key_exists("errmsg", $respJson)) {
  190. return FALSE;
  191. }
  192. return TRUE;
  193. }
  194. /**
  195. * @param type $str
  196. * @return type 给字符串签名
  197. */
  198. function getSign($str) {
  199. $vkey = self::formatPriKey($this->cpvkey); //格式化key,建议将格式化后的key保存,直接调用
  200. return self::sign($str, $vkey); //生成签名
  201. }
  202. }