近期改了下PHP代码:
<?php
/**
* Created by PhpStorm.
* User: UFO
* Date: 17/8/21
* Time: 下午3:16
* 参考链接:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1&index=1
*/
require_once "WxPay.ConfigPro.php";
class WxmPayPro {
function wx_getPayRequest( $mid, $openid, $orderid, $rmb, $title, $body, $type='1' )
{
$tradeid = $mid.$type;//订单号,这个根据自己需求自定义, mid是支付订单里第三方也就是商户我自己的业务逻辑,不写也可以
$nonce = $orderid.mt_rand(10000,99999);
$notify = 'http://'.Plat_Const::getApiHost().'/pay/miniwxpage.php';//回调地址,自己写,支付成功回调,在回调页面进行更改与用户金钱相关的代码
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
// post data
$now = time().'';//时间
$appid = Plat_PayFunc::getMiniWxSecret( $millid, 'appid' );//小程序ID 写到一个类里面了 方便后期修改 当然也可以在这里直接写
$mchid = Plat_PayFunc::getMiniWxSecret( $millid, 'mchid' );//商户号
$data = array(
'appid' => $appid,
'mch_id' => $mchid,
'spbill_create_ip' => CBase_Ip::getLocalIp(),//终端ip Y
'nonce_str' => $nonce, //随机字符串Y
'openid' => $openid, //用户标识 N
'body' => $title, //商品描述 Y
// 'detail' => $body, //商品详情 N
'attach' => $tradeid, //附加数据 N
'out_trade_no' => $tradeid, //商户订单号 Y
'total_fee' => $rmb, //总金额 单位分 int Y
'notify_url' => $notify, //通知地址 Y
'trade_type' => 'JSAPI',
);
$data[ 'sign' ] = self::wx_getPkgSign($millid, $data);
$ret = Plat_Net::post( $url, self::wx_toXml($data) );//自己写的网络请求类,这里也可以用其他网络请求
$json = self::wx_parseXML( $ret );
if( !$json || !isset($json[ 'prepay_id' ]) )
{
return array( 'ret' => 'fail', 'tip' => $json[ 'return_msg' ] );
}
// prepare for client
$prepayid = $json[ 'prepay_id' ];
$req = array(
'appId' => $appid,
'timeStamp' => $now,
'nonceStr' => $nonce,
'package' => 'prepay_id='.$prepayid,
'signType' => 'MD5',
);
$req[ 'paySign' ] = self::wx_getPkgSign( $millid, $req );
return json_encode($req);
}
public function wx_getPkgSign( $millid, $req )
{
$pars = '';
ksort( $req );
foreach( $req as $k => $v )
{
if( 'sign' != $k && $v !== '' )
{
$pars .= $k . '=' . $v . '&';
}
}
$mkey = Plat_PayFunc::getMiniWxSecret( $millid, 'key' );
$pars .= 'key='. $mkey;
return strtoupper( md5($pars) );
}
public function wx_toXML( $data )
{
$xml = '<xml>';
foreach( $data as $key => $val )
{
$xml .= '<' . $key . '><![CDATA[' . $val . ']]></' . $key . '>';
}
$xml .= '</xml>';
return $xml;
}
public function wx_parseXML( $str )
{
$rsp = array();
$xml = @simplexml_load_string( $str );
if( $xml && $xml->children() )
{
foreach( $xml->children() as $node )
{
if( $node->children() )
{
$k = $node->getName();
$nodeXml = $node->asXML();
$v = substr( $nodeXml, strlen($k)+2, strlen($nodeXml)-2*strlen($k)-5 );
}
else
{
$k = $node->getName();
$v = (string)$node;
}
$rsp[ $k ] = $v;
}
}
return $rsp;
}
}
?>
然后调用:
$data = WxmPayPro::wx_getPayRequest( $mid, $openid, $orderid, $prmb, $title, $body, '1' );
data即为小程序前端支付所需数据