为了方便,我直接在example文件夹中找到WxPay.Config分别设置了,打码的部分自行补充
备用参数:订单参数$order,openid $openId
$tools = new JsApiPay();
//②、统一下单
$input = new WxPayUnifiedOrder();
$input->SetBody("XXX");
$input->SetAttach("test");
$input->SetOut_trade_no("sdkphp".date("YmdHis"));
$input->SetTotal_fee(intval($order['order_amount']*100));
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("https://xcx.XXX.com/xcx/XXX");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$config = new WxPayConfig();
$fiedorder = WxPayApi::unifiedOrder($config, $input);
//网页版的支付继续走下边
$jsApiParameters = $tools->GetJsApiParameters($fiedorder);
return $jsApiParameters;
小程序代码:
wx.requestPayment({
'timeStamp': res.data.timeStamp,
'nonceStr': res.data.nonceStr,
'package': res.data.package,
'signType': res.data.signType,
'paySign': res.data.paySign,
'success': function(res1) {
console.log(res1);
},
'fail': function(res1) {
console.log(res1);
},
'complete': function(res1) {
//console.log('接口调用结束的回调函数(调用成功、失败都会执行)');
}
})
回调函数:
public function order_success(){
$xml=file_get_contents("php://input");
$fp = fopen('./writeTpLog.txt', 'a+b');
fwrite($fp, $xml);
fclose($fp);
//开启调试
define('WXDEBUG', true);
// 将服务器返回的XML数据转化为数组
$data = $this->fromXml($xml);
// 保存微信服务器返回的签名sign
$dataSign = $data['sign'];
// sign不参与签名算法
unset($data['sign']);
// 生成签名
$sign = $this->MakeSign($data);//记得在函数中把key填上!!!别只会抄
$wx_total_fee = $data['total_fee'];
//将获取的参数写入文件,测试是否毁回调成功
$fp = fopen('./writeTpLog.txt', 'a+b');
fwrite($fp, $dataSign."<br/>3333ss<br/><br/><br/><br/><br/><br/>".$sign."<br/>sfsdfsdf885<br/><br/><br/><br/><br/><br/>"."\n\n\n\n\n\n\n\n".$data['return_code']."\n\n\n\n\n\n".$data['total_fee']."\n\n\n\n\n\n");
fclose($fp);
// 判断签名是否正确 判断支付状态
if (($sign === $dataSign) && ($data['return_code'] == 'SUCCESS') && ($data['result_code'] == 'SUCCESS')) {
$fp = fopen('./writeTpLog.txt', 'a+b');
fwrite($fp, "支付成功");
fclose($fp);
}
}
/**
* 生成签名
* @param WxPayConfigInterface $config 配置对象
* @param bool $needSignType 是否需要补signtype
* @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
*/
public function MakeSign($data)
{
//签名步骤一:按字典序排序参数
ksort($data);
$string = $this->toUrlParams($data);
//签名步骤二:在string后加入KEY
$string = $string . "&key=XXXX";
//签名步骤三:MD5加密或者HMAC-SHA256 自己的签名使用的是sha256
$string = hash_hmac("sha256",$string ,"XXXX");
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
/**
* 将xml转为array
* @param string $xml
* @throws WxPayException
*/
public function FromXml($xml)
{
if(!$xml){
throw new WxPayException("xml数据异常!");
}
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $this->values;
}
/**
* 格式化参数格式化成url参数
* @param $values
* @return string
*/
public function toUrlParams($values)
{
$buff = '';
foreach ($values as $k => $v) {
if ($k != 'sign' && $v != '' && !is_array($v)) {
$buff .= $k . '=' . $v . '&';
}
}
return trim($buff, '&');
}
/*
* 给微信发送确认订单金额和签名正确,SUCCESS信息 -xzz0521
*/
private function return_success(){
$return['return_code'] = 'SUCCESS';
$return['return_msg'] = 'OK';
$xml_post = '<xml>
<return_code>'.$return['return_code'].'</return_code>
<return_msg>'.$return['return_msg'].'</return_msg>
</xml>';
echo $xml_post;exit;
}
这是最终的结果