微信小程序之wx.requestPayment 发起微信支付

wx.requestPayment 发起微信支付

timeStamp 时间戳

nonceStr 随机字符串

package 统一下单接口返回的 prepay_id 参数值

signType 签名算法

paySign 支付签名

success 接口成功回调

fail 接口失败回调

complete 接口完成回调(成功,失败都执行)

1.先调用后台接口,生产基本数据

  1. // 获取店铺信息
  2. Api.BalancePay({
  3. openid: openid,
  4. amount: amount,
  5. bid: bid,
  6. }).then(res => {
  7. if (res.errno) {
  8. wx.showToast({ title: res.errdesc });
  9. return;
  10. }
  11. var data = res. data;
  12. ...
  13. })

具体的这个是做什么的呢?

判断用户是否存在。

判断充值id是否存在。

判断充值金额是否合法。

创建充值订单。

创建统一支付订单。

  1. public function unifiedorder($openid,$order_num,$total_fee,$products_name){
  2. $trade_no = $order_num;
  3. $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
  4. $data = [
  5. 'appid' => C( 'APPID'),
  6. 'mch_id' => C( 'MCHID'),
  7. 'nonce_str' => $this->createNonceStr(),
  8. 'sign_type' => 'MD5',
  9. 'body' => $products_name, //商品名称组合
  10. 'attach' => C( 'PAY_ATTACH_NAME'),
  11. 'out_trade_no' => $trade_no, //订单号
  12. 'fee_type' => 'CNY',
  13. 'total_fee' => $total_fee,
  14. 'spbill_create_ip' => $_SERVER[ 'REMOTE_ADDR'],
  15. 'goods_tag' => C( 'PAY_ATTACH_NAME'),
  16. 'notify_url' => 'https://a.squmo.com/'.C( 'PAY_URL_NAME'). '/Recharge/order_notice',
  17. 'trade_type' => 'JSAPI',
  18. 'openid' => $openid
  19. ];
  20. // 获取签名
  21. $sign = $this->MakeSign($data);
  22. $data[ 'sign'] = $sign;
  23. $xml = $this->ToXml($data);
  24. vendor( 'Func.Http');
  25. // 提交获取数据
  26. $result = $this->FromXml(Http::postXmlCurl($url,$xml));
  27. return $result;
  28. }

一切准备就绪之后,将一些数据返回给小程序。

  1. $unifiedorder = $this->unifiedorder($openid,$order_num,$total_price,$products_name);
  2. $data = [
  3. 'appId' => C( 'APPID'),
  4. 'timeStamp' => time(),
  5. 'nonceStr' => $this->createNonceStr(),
  6. 'package' => 'prepay_id='.$unifiedorder[ 'prepay_id'],
  7. 'signType' => 'MD5'
  8. ];
  9. // 获取签名
  10. $sign = $this->MakeSign($data);
  11. $data[ 'sign'] = $sign;
  12. $this->json->setAttr( 'data',$data);
  13. $this->json->Send();

2.再发起微信支付

  1. wx.requestPayment({
  2. 'timeStamp': data.timeStamp.toString(),
  3. 'nonceStr': data.nonceStr,
  4. 'package': data.package,
  5. 'signType': 'MD5',
  6. 'paySign': data.sign,
  7. 'success': function (res) {
  8. console.log( '支付成功');
  9. },
  10. 'fail': function (res) {
  11. console.log( '支付失败');
  12. return;
  13. },
  14. 'complete': function (res) {
  15. console.log( '支付完成');
  16. var url = that.data.url;
  17. console.log( 'get url', url)
  18. if (res.errMsg == 'requestPayment:ok') {
  19. wx.showModal({
  20. title: '提示',
  21. content: '充值成功'
  22. });
  23. if (url) {
  24. setTimeout( function () {
  25. wx.redirectTo({
  26. url: '/pages' + url
  27. });
  28. }, 2000)
  29. } else {
  30. setTimeout( () => {
  31. wx.navigateBack()
  32. }, 2000)
  33. }
  34. }
  35. return;
  36. }
  37. });

3.支付成功的回调(异步操作)

  1. //微信支付回调
  2. public function order_notice(){
  3. // 微信公众平台推送过来的post数据
  4. $xml = $GLOBALS[ 'HTTP_RAW_POST_DATA'];
  5. // 获取数据
  6. $data = $this->FromXml($xml);
  7. // 保存微信服务器返回的签名sign
  8. $data_sign = $data[ 'sign'];
  9. // sign不参与签名算法
  10. unset($data[ 'sign']);
  11. $sign = $this->makeSign($data);
  12. // 判断签名是否正确 判断支付状态
  13. if ( ($sign===$data_sign) && ($data[ 'return_code']== 'SUCCESS') && ($data[ 'result_code']== 'SUCCESS') ) {
  14. $result = $data;
  15. //获取服务器返回的数据
  16. $order_num = $data[ 'out_trade_no']; //订单单号
  17. $openid = $data[ 'openid']; //付款人openID
  18. $total_fee = $data[ 'total_fee']; //付款金额
  19. $transaction_id = $data[ 'transaction_id']; //微信支付流水号
  20. $user = M( 'user');
  21. $user_flag = $user->where( array( 'openid'=>$openid))->find();
  22. $save_data = array(
  23. 'total_payed_price' => $total_fee, //实际到帐金额
  24. 'transaction_id' => $transaction_id,
  25. 'paytime' => time(),
  26. 'status' => 2 //1未支付;2已支付;3已申请退款;4已退款;5已完成
  27. );
  28. $recharge = M( 'recharge');
  29. $recharge_flag=$recharge->where( array( 'recoder'=>$order_num, 'uid'=>$user_flag[ 'id']))->find();
  30. $recharge_amount=$recharge_flag[ 'amount'];
  31. $recharge_save_flag =$recharge->where( array( 'recoder'=>$order_num, 'uid'=>$user_flag[ 'id']))->save($save_data);
  32. if($recharge_save_flag){
  33. $save_balance[ 'balance']= $user_flag[ 'balance']+$recharge_amount;
  34. $result_balance =$user->where( array( 'openid'=>$openid))->save($save_balance);
  35. }
  36. } else{
  37. $result = false;
  38. }
  39. // 返回状态给微信服务器
  40. if ($result) {
  41. $str= '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
  42. } else{
  43. $str= '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
  44. }
  45. echo $str;
  46. return $result;
  47. }

其他常用函数

  1. public function FromXml($xml)
  2. {
  3. if(!$xml){
  4. throw new WxPayException( "xml数据异常!");
  5. }
  6. //将XML转为array
  7. //禁止引用外部xml实体
  8. libxml_disable_entity_loader( true);
  9. $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  10. return $this->values;
  11. }
  12. public function ToXml($array){
  13. if(!is_array($array)|| count($array) <= 0){
  14. return ;
  15. }
  16. $xml = '<xml version="1.0">';
  17. foreach ($array as $key=>$val){
  18. if (is_numeric($val)){
  19. $xml.= "<".$key. ">".$val. "</".$key. ">";
  20. } else{
  21. $xml.= "<".$key. "><![CDATA[".$val. "]]></".$key. ">";
  22. }
  23. }
  24. $xml.= "</xml>";
  25. return $xml;
  26. }
  27. private function MakeSign($data)
  28. {
  29. //签名步骤一:按字典序排序参数
  30. ksort($data);
  31. $string = $this->ToUrlParams($data);
  32. //签名步骤二:在string后加入KEY
  33. $string = $string . "&key=".C( 'WEIXIN_PAY_KEY');
  34. //签名步骤三:MD5加密
  35. $string = md5($string);
  36. //签名步骤四:所有字符转为大写
  37. $result = strtoupper($string);
  38. return $result;
  39. }
  40. private function ToUrlParams($array)
  41. {
  42. $buff = "";
  43. foreach ($array as $k => $v)
  44. {
  45. if($k != "sign" && $v != "" && !is_array($v)){
  46. $buff .= $k . "=" . $v . "&";
  47. }
  48. }
  49. $buff = trim($buff, "&");
  50. return $buff;
  51. }
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值