🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 1.支付宝-App移动支付 支付宝 , 移动端通过获取服务端返回的字符串掉起支付宝客户端 ``` <?php namespace app\api\service; /* * 支付宝支付接口 * * */ require_once (EXTEND_PATH.'alipay03/AopSdk.php'); class AliPay { /** *生成APP支付订单信息 * @param string $orderId 商品订单ID * @param string $subject 支付商品的标题 * @param string $body 支付商品描述 * @param float $pre_price 商品总支付金额 * @param int $expire 支付交易时间 * @return bool|string 返回支付宝签名后订单信息,否则返回false */ public function unifiedorder($orderId, $subject,$body,$pre_price,$expire){ /*支付宝老版本(2016年8月份) 服务端无需SDK,直接RSA加密拼接字符串*/ $mygoods['partner'] = '"'.config('text.qnm_aliapy_partner').'"'; $mygoods['seller_id'] = '"'.config('text.qnm_alipay_sellerid').'"'; $mygoods['out_trade_no'] = '"'.$orderId.'"'; $mygoods['subject'] = '"'.$subject.'"'; $mygoods['body'] = '"'.$body.'"'; $mygoods['total_fee'] = '"'.$pre_price.'"'; $mygoods['notify_url'] = '"'.config('text.qnm_aliacall_url').'"'; $mygoods['service'] = "\"mobile.securitypay.pay\""; $mygoods['payment_type'] = "\"1\""; $mygoods['_input_charset'] = "\"utf-8\""; $mygoods['it_b_pay'] = "\"30m\""; // 数组拼接成字符串 $mystr = $this->createLinkstring($mygoods); //生成最终签名信息 $sign = $this->rsaSign($mystr,'/home/canmay/www/test.qunarmeic.com/public/key/alia_prikey.pem'); $sign = urlencode($sign); //生成最终签名信息 $rest = $mystr.'&sign="'.$sign.'"&sign_type="RSA"'; return $rest; /*支付宝新版本,需要引入官网下载的SDK*/ $aop = new \AopClient(); $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = config('alia_pay.appid'); $aop->rsaPrivateKey = config('alia_pay.private_key'); $aop->format = "json"; $aop->charset = "UTF-8"; $aop->signType = "RSA2"; $aop->alipayrsaPublicKey = config('alia_pay.public_key'); //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay $request = new \AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数 $bizcontent = "{\"body\":\"{$body}\"," //支付商品描述 . "\"subject\":\"{$subject}\"," //支付商品的标题 . "\"out_trade_no\":\"{$orderId}\"," //商户网站唯一订单号 . "\"timeout_express\":\"{$expire}m\"," //该笔订单允许的最晚付款时间,逾期将关闭交易 . "\"total_amount\":\"{$pre_price}\"," //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000] . "\"product_code\":\"QUICK_MSECURITY_PAY\"" . "}"; $request->setNotifyUrl(config('alia_pay.notify_url')); $request->setBizContent($bizcontent); //这里和普通的接口调用不同,使用的是sdkExecute $response = $aop->sdkExecute($request); //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题 return $response; } /*************************需要使用到的方法*******************************/ /** * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 * @param $para 需要拼接的数组 * return 拼接完成以后的字符串 */ private function createLinkstring($para) { $arg = ""; while (list ($key, $val) = each ($para)) { $arg.=$key."=".$val."&"; } //去掉最后一个&字符 $arg = substr($arg,0,count($arg)-2); //如果存在转义字符,那么去掉转义 if(get_magic_quotes_gpc()){$arg = stripslashes($arg);} return $arg; } /** * 对数组排序 * @param $para 排序前的数组 * return 排序后的数组 */ private function argSort($para) { ksort($para); reset($para); return $para; } /** * RSA签名 * @param $data 待签名数据 * @param $private_key_path 商户私钥文件路径 * return 签名结果 */ private function rsaSign($data,$private_key_path) { $priKey = file_get_contents($private_key_path); $res = openssl_get_privatekey($priKey); openssl_sign($data, $sign, $res); openssl_free_key($res); //base64编码 $sign = base64_encode($sign); return $sign; } /**RSA验签 * $data待签名数据 * $sign需要验签的签名 * 验签用支付宝公钥 * return 验签是否通过 bool值 */ private function verify($data, $sign) { //读取支付宝公钥文件 $pubKey = file_get_contents('key/alipay_public_key.pem'); //转换为openssl格式密钥 $res = openssl_get_publickey($pubKey); //调用openssl内置方法验签,返回bool值 $result = (bool)openssl_verify($data, base64_decode($sign), $res); //释放资源 openssl_free_key($res); //返回资源是否成功 return $result; } } ```