1、准备资料,略。
2、微信小程序支付用的是trade_type:JSAPI,但是这并不意味着可以直接把微信公众号支付代码拿过来,还需要重新写。
3、上demo代码,其中一些互转完全可以百度出来,比如xml转数组,数组转xml,进行post请求等。
4、不需要引入任何类,extend等都不需要
public function wxpay() { $openid=input('post.openid'); $mch_id = '152223331'; //商户ID $pay_key = 'c4c4238a0b923820dcc509a6f75849b'; //商户密钥 $appid = 'wxb707afa34a3be7b'; //微信分配的小程序ID $nonce_str = md5(uniqid(md5(microtime(true)),true)); //生成随机字符串,长度要求在32位以内 $notify_url ='https://www.xx.cn/'; //异步接收微信支付结果通知的回调地址 $data=[ 'appid'=>$appid, 'mch_id'=>$mch_id, 'nonce_str'=>$nonce_str, 'body'=>'会员充值', 'openid'=>$openid, 'out_trade_no'=>time(), 'total_fee'=>1, 'spbill_create_ip'=>$_SERVER['SERVER_ADDR'], 'notify_url'=>$notify_url, 'trade_type'=>'JSAPI', ]; //生成支付签名 $data['sign'] = $this->MakeSign($data,$pay_key); $post_xml =$this->arrayToXml($data); //将数组转换为数组xml数据 $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $xml = $this->curl_post($url,$post_xml); //POST请求 $return_data=$this->xmlToArray($xml); //将xml数据转换为数组 if($return_data['return_code'] == 'SUCCESS'){ $re_array=[ 'appId' =>$appid, 'nonceStr'=>$nonce_str, 'package'=>'prepay_id='.$return_data['prepay_id'], 'signType'=>'MD5', 'timeStamp'=>(String)time(), //注意要String类型 ]; $re_array['paySign'] = $this->MakeSign($re_array,$pay_key); return json($re_array); }else{ $msg = isset($return_data['return_msg']) ? $return_data['return_msg']:'发起支付失败'; return json(['status'=>false,'msg'=>$msg,'data'=>[]]); } } /** * 生成签名 * @param $params 加密数组 * @param $KEY 支付key * * @return $result 签名值 * */ public function MakeSign($params, $keys) { //第一步:按字典序排序数组参数 ksort($params); //参数进行拼接key=value&k=v $string = ''; if (!empty($params)) { $array = array(); foreach ($params as $key => $value) { $array[] = $key . '=' . $value; } $string = implode("&", $array); } //第二步:在string后加入keys $string = $string . "&key=" . $keys; //第三步:MD5加密 $string = md5($string); //第四步:所有字符转为大写 $result = strtoupper($string); return $result; } public function curl_post($url , $data=array()){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // POST数据 curl_setopt($ch, CURLOPT_POST, 1); // 把post的变量加上 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $output = curl_exec($ch); curl_close($ch); return $output; } function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key => $val){ if (is_numeric($val)){ $xml.="<$key>$val</$key>"; } else $xml.="<$key><![CDATA[$val]]></$key>"; } $xml.="</xml>"; return $xml; } function xmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $values; }
uniapp点击支付按钮后,请求上面wxpay方法,预支付请求后返回给uniapp,uniapp接收到如下:
appId: "wxb707a6fa34a3b7b" nonceStr: "d06c16584f1b272643d7146bca758bd9" package: "prepay_id=wx18092258124322d8fa2c7773b91fef0000" paySign: "3F5B1EFC7E34C3C753F41360F2669823" signType: "MD5" timeStamp: "1613611378"
这样即可实现支付,可用开发者本人微信进行测试支付。
参考资料:https://blog.csdn.net/qq_30006251/article/details/108242751