###最近公司接了一个项目,其中一个功能就是三码合一支付。
本来想到要直接拒绝的。但是IOS开发说可行。我当时是很不了解的。在网上找了半天也都是一些没什么用的文档(也可能是自己没有找准方向) 所以内心的拒绝的。不过最后还是动手开发了。哈哈哈。
1.微信支付。首先要开通JSAPI支付。话不多说。直接上代码
public function getParameters($order_sn)
{
// 获取配置项
$config = $this->config;
// 如果没有get参数没有code;则重定向去获取openid;
if (!isset($_GET['code'])) {
// 获取订单号
// 返回的url
$redirect_uri = U('api/Pay/pays', '', '', true);
// $redirect_uri = 'http://earlyqin.bonnidee.cn/index.php?m=home&c=Weixinpay&a=pay';
$redirect_uri = urlencode($redirect_uri);
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $config['APPID'] . '&redirect_uri=' . $redirect_uri . '&response_type=code&scope=snsapi_base&state=' . $order_sn . '#wechat_redirect';
header("Location: {$url}");exit;
// redirect($url);
} else {
// 如果有code参数;则表示获取到openid
$code = I('get.code');
// 取出订单号
$out_trade_no = I('get.state');
if (empty($out_trade_no)) {
$out_trade_no = $order_sn;
}
$resultGoods = M('pays')->where("order_sn='$out_trade_no'")->find();
// 组合获取prepay_id的url
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $config['APPID'] . '&secret=' . $config['APPSECRET'] . '&code=' . $code . '&grant_type=authorization_code';
$result = $this->getJson($url);
// var_dump($result);exit;
$openid = $result['openid'];
// $body = $goods_result['goods_name'];
$body = '测试二维码';
//微信以分为单位
$total_fee = $resultGoods['amount'] * 100;
$out_trade_no = $resultGoods['order_sn'];
// 订单数据 请根据订单号out_trade_no 从数据库中查出实际的body、total_fee、out_trade_no、product_id
$data = array(
'body' => $body,// 商品描述(需要根据自己的业务修改)
'total_fee' => $total_fee,// 订单金额 以(分)为单位(需要根据自己的业务修改)
'out_trade_no' => $out_trade_no,// 订单号(需要根据自己的业务修改)
'trade_type' => 'JSAPI',// JSAPI公众号支付
'openid' => $openid,// 获取到的openid
'appid' => $config['APPID'],
'mch_id' => $config['MCHID'],
'nonce_str' => md5(time() . '!@#$%^&*()_+'),
'spbill_create_ip' => '192.168.0.1',
'notify_url' => $config['NOTIFY_URL']
);
// 生成签名
$sign = $this->makeSign($data);
$data['sign'] = $sign;
$xml = $this->toXml($data);
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';//接收xml数据的文件
$header[] = "Content-type: text/xml,charset:utf-8";//定义content-type为xml,注意是数组
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 兼容本地没有指定curl.cainfo路径的错误
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$response = curl_exec($ch);
if (curl_errno($ch)) {
// 显示报错信息;终止继续执行
die(curl_error($ch));
}
curl_close($ch);
$result = $this->toArray($response);
// 显示错误信息
if ($result['return_code'] == 'FAIL') {
die($result['return_msg']);
}
// 组合jssdk需要用到的数据
$datas = array(
'appId' => $config['APPID'], //appid
'timeStamp' => strval(time()), //时间戳
'nonceStr' => md5(time() . '!@#$%^&*()_+'),// 随机字符串
'package' => 'prepay_id=' . $result['prepay_id'],// 预支付交易会话标识
'signType' => 'MD5'//加密方式
);
// 生成签名
$datas['paySign'] = $this->makeSign($datas);
return $datas;
}
}
返回值就可以直接用js掉漆支付了。至于中介调用的一些函数微信文档SDK里面都有。我就不复制了
2.然后就是支付宝支付了。我在探索了所有支付宝支付的条件之后选择了手机网页支付。(其他的还没试过,喜探索的小伙伴可以多试试)下面是代码:
//手机网站
public function alipay(){
$order_sn = 'ST'.time().rand(1000,9999);
$total_fee = $_REQUEST['amount'] ? $_REQUEST['amount'] : 0.1;
require_once 'AopClient.php';
$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = $this->appId_app;
$aop->rsaPrivateKey = $this->rsaPrivateKey_app;
$aop->alipayrsaPublicKey=$this->aliPayRsaPublicKey_app;
$aop->charset='UTF-8';
$aop->format='json';
$aop->signType='RSA2';
require_once 'request/AlipayTradeWapPayRequest.php';
$request = new AlipayTradeWapPayRequest ();
$arr['body'] = '云聪支付';
$arr['subject'] = "云聪支付";
$arr['out_trade_no'] = $order_sn;
$arr['timeout_express'] = '30m';
$arr['total_amount'] = $total_fee;
$arr['product_code'] = 'QUICK_WAP_WAY';
$json = json_encode($arr);
$request->setNotifyUrl($this->notifyurl);
$request->setBizContent($json);
$response = $aop->pageExecute($request);
echo $response;
}
3.至于第三个码就是公司自己的二维码了。哈哈。自己创建的钱包,自己创建的扣款机制。代码对于自己来说就可以为所欲为了。
至于自己怎么区分是微信,支付宝。还是自己的APP扫码。用这个 HTTP_USER_AGENT。分分钟可以百度出来。哈哈。就这样一个模仿的窝窝收款就出来了