React-native 中的 Payumoney 集成

问题描述 投票:0回答:2

我正在尝试将 payumoney 支付网关集成到反应本机中,但是当我按下“支付”按钮时,出现错误 手机屏幕上显示“java.lang.double 无法转换为 java.lang.string”。

我在整个谷歌中搜索了代码,但我使用了 Node js 作为后端。

我的JS文件是这样的:-

import * as React from 'react';
import { Image, ImageBackground, ScrollView, Animated, Text, StyleSheet, View, ListView, TextInput, ActivityIndicator, Alert, TouchableOpacity } from 'react-native';
import PayuMoney from 'react-native-payumoney';

export default class Consult_dr extends React.Component {

  constructor(props) {
    super(props);
    this.state = { 
      name:'',
      email:'',
      phone:'',
    };
    this._makePay = this._makePay.bind(this);
  }

   _makePay() {

    let amount = 300;
    let d = new Date();
    let txid = d.getTime();
    let productId = "Consulting";
    let name = this.state.name;
    let email = this.state.email;
    let phone = this.state.phone;
    let surl = "https://www.payumoney.com/mobileapp/payumoney/success.php"; 
    let furl = "https://www.payumoney.com/mobileapp/payumoney/failure.php";
    let id = "xxxxxx"; 
    let key = "xxxxxx"; 
    let sandbox = true; //Make sure to set false on production or you will get error

    fetch('https://athirst-desertions.000webhostapp.com/payu-hash.php', {
        method: 'POST',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            key: key,
            txnid: txid,
            amount: amount,
            productinfo: productId,
            firstname: name,
            email: email,
            phone: phone,
        }),
    })
    .then((response) => response.text())
    .then((hash) => {
      var test = hash.replace(/\"/g, "");
        let options = {
            amount: amount,
            txid: txid ,
            productId: productId,
            name: name,
            email: email,
            phone: phone,
            id: id,
            key: key,
            surl: surl,
            furl: furl,
            sandbox: sandbox,
            hash: test
        };
      console.log("this is then funciton====", options)
        PayuMoney.pay(options).then((d) => {
            console.log("payumoney===>",d);
        }).catch(e => {
            console.log(e);
        });
     })  
   }

  static navigationOptions = { title: 'Consult Doctor',};

  render() {

    return (
      <ScrollView>
      <ImageBackground source={require('../assets/bg.png')} style={styles.container} >

        <Image 
          source={require('../btnimage/consult_dr_header.jpg')} 
          style={{width:420, height:300, marginTop:20}} 
        />

        <View style={{marginTop:100, marginLeft:20, marginRight:20, marginBottom:200}}>


            <TextInput
              placeholder = "Descrbe your problem in detail"
              placeholderTextColor="white"
              onChangeText = {(TextInputText) => this.setState({name:TextInputText})} />

              <TextInput
              placeholder = "Descrbe your problem in detail"
              placeholderTextColor="white"
              style = {styles.textInput}
              onChangeText = {(TextInputText) => this.setState({email:TextInputText})} />

          <TextInput
            placeholder = "Descrbe your problem in detail"
            placeholderTextColor="white"
            style = {styles.textInput}
            onChangeText = {(TextInputText) => this.setState({phone:TextInputText})} />

          <TouchableOpacity style={styles.btnstyle}
            onPress={this._makePay}>
            <Text style={{textAlign: 'center', color: 'blue',}}> Submit </Text>
          </TouchableOpacity> 

        </View>
      </ImageBackground>
      </ScrollView>    
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    width: null,
    height: null,
  },
  textInput:{
    width: 300,
    color: 'white',
  },
});

我的后端代码是这样的:-

<?php 

$HostName = "localhost";
$DatabaseName = "xxxxxxxxxx";
$HostUser = "xxxxxxxxx";
$HostPass = "xxxxxxxxx";

$conn = new mysqli($HostName, $HostUser, $HostPass, $DatabaseName);

$obj = json_decode(file_get_contents('php://input'), true);

if(isset($obj["txnid"]))
{
    $merchant_key = "xxxxxx";
    $salt = "xxxxx";
    $txnid = $obj['txnid'];
    $amount = $obj['amount'];
    $productinfo = $obj['productinfo'];
    $firstname = $obj['firstname'];
    $email = $obj['email'];
    $phone = $obj['phone'];

    $query = "INSERT INTO `pay_table` ( txnid, amount, productinfo, firstname, email, phone ) VALUES ('$txnid', '$amount', '$productinfo', '$firstname', '$email', '$phone')";

    $hash = $merchant_key."|".$txnid."|".$amount."|".$productinfo."|".$firstname."|".$email."|".$phone."|".$salt;
    $hashkey = strtolower(hash('sha512', $hash));

    $result = $conn->query($query);

    if ($result == 1)
    {
        $data = $hashkey;
        //header('Content-type: application/json');

    }
    else
    {
        $data["message"] = "data not saved successfully";
        $data["status"] = "error";    
    }
}
else
{
    $data["message"] = "Format not supported";
    $data["status"] = "error";    
}
    echo json_encode($data);

?>

我的回复是这样的:-

'this is then funciton====', { amount: 300,
txid: 1538136491771,
productId: 'Consulting',
name: 'All',
email: 'So',
phone: '335689',
id: 'xxxxxxx',
key: 'Xxxxxxx',
surl: 'https://www.payumoney.com/mobileapp/payumoney/success.php',
furl: 'https://www.payumoney.com/mobileapp/payumoney/failure.php',
sandbox: false,
hash: '4c9a9dfdfb909cf8f93cefb1f26c736f404b339c8e77d98a2f95f1af879c6a8c06c6f23352f39a180272d15c181b98c70bf1dff7009ef5a732c4ae7da5f9a0fa' }
php react-native payment-gateway payumoney
2个回答
1
投票

这可能迟到了,但问题与您的金额有关, 金额应为 300.0 双倍值。

请尝试通过此

let options = {
    amount: 10.0,
    txid: "123123123" ,
    productId: "test",
    name: "Name",
    email: "[email protected]",
    phone: "8826343434",
    id: "393463",
    key: "LLKwG0",
    surl: "https://www.payumoney.com/mobileapp/payumoney/success.php",
    furl: "https://www.payumoney.com/mobileapp/payumoney/failure.php",
    sandbox: true,
    hash: "d829abecdaf9f2835787b3f56d1c7565721ca2501e6414438e61948dab435f102fc93213008cdfa3474691cadcc2dabdde64cd58c128dd2afcf3b389d617919c"
};
PayuMoney.pay(options).then((d) => {
    console.log(d); // WIll get a Success response with verification hash
}).catch(e => {
    console.log(e); //In case of failture
});

PHP 服务器端代码:

<?php
echo makeHash("LLKwG0","123123123","10.0","test","Name","[email protected]");

function makeHash($key, $txnid, $amount, $productinfo, $firstname, $email){
    $salt = "qauKbEAJ";
    $payhash_str = $key . '|' . checkNull($txnid) . '|' . checkNull($amount) . '|' . checkNull($productinfo) . '|' . checkNull($firstname) . '|' . checkNull($email) . '|||||||||||' . $salt;
    $hash = strtolower(hash('sha512', $payhash_str));
    return $hash;
}

function checkNull($value)
{
    if ($value == null) {
        return '';
    } else {
        return $value;
    }
}
?>

参考:Github问题链接


0
投票

替代解决方案:

您需要在浏览器中配置 PayUMoney 并使用 WebView 调用该屏幕。

PS:我成功实现了这个。

编辑:

步骤:

  1. 包含我们的自定义 PayUMoney 组件
    {PayUModalVisibility && (
            <PayUMoney
              visible={PayUModalVisibility}
              onCloseModal={() =>
                this.setState({PayUModalVisibility: false, billingData: []})
              }
              getMagicResponse={magicResponse =>
                this.getMagicResponse(magicResponse)
              }
              paymentOptions={onlineObj}
            />
          )}
  1. 我的 getMagicResponse 函数
getMagicResponse(resp) {
console.log(resp);
    if (resp.status === 'success') {
        //do whatever u want
    }
  }

3.我的 PayUMoney 组件。

import React from 'react';
import {StyleSheet, View, Modal} from 'react-native';
import {Button, Text} from 'native-base';
import {WebView} from 'react-native-webview';

import styles from './styles';

class PayUMoney extends React.Component {
  constructor(props) {
    super(props);
    this.myWebView;
    this.state = {
      response: '',
    };
  }

  render() {
    const {
      visible,
      getMagicResponse,
      paymentOptions: {amount, productinfo, firstname, lastname, email, phone},
    } = this.props;
    const runFirst = `
            document.getElementById("amount").value = '${amount}';
            document.getElementById("firstname").value = '${firstname}';
            document.getElementById("lastname").value = '${lastname}';
            document.getElementById("email").value = '${email}';
            document.getElementById("phone").value = '${phone}';
            document.getElementById("productinfo").value = '${productinfo}';
            setTimeout(() => {
              document.forms.payuForm.submit();
            }, 200);
          `;

    return (
      <Modal
        animationType={'slide'}
        visible={visible}
        onRequestClose={() => {}}>
        <View style={styles.modalView}>
          <WebView
            ref={el => (this.myWebView = el)}
            startInLoadingState={true}
            useWebKit={false}
            javaScriptEnabled={true}
            domStorageEnabled={true}
            scalesPageToFit={true}
            automaticallyAdjustContentInsets={true}
            injectedJavaScript={runFirst}
            onMessage={event => {
              let response_data = JSON.parse(event.nativeEvent.data);
              getMagicResponse(response_data);
            }}
            source={{
              uri: 'my_payuform_on_my_server.php',
            }}
          />
        </View>
      </Modal>
    );
  }
}

export default PayUMoney;
  1. 使用 payumoney web sdk 配置我的 my_payuform_on_my_server.php。
<?php

$MERCHANT_KEY = "XXXXXX";
$SALT = "YYYYYY";
// Merchant Key and Salt as provided by Payu.

// $PAYU_BASE_URL = "https://sandboxsecure.payu.in";        // For Sandbox Mode
$PAYU_BASE_URL = "https://secure.payu.in";      // For Production Mode

$action = '';

$posted = array();
if (!empty($_POST)) {
  //print_r($_POST);
  foreach ($_POST as $key => $value) {
    $posted[$key] = $value;
  }
}

$formError = 0;

if (empty($posted['txnid'])) {
  // Generate random transaction id
  $txnid = substr(hash('sha256', mt_rand() . microtime()), 0, 20);
} else {
  $txnid = $posted['txnid'];
}
$hash = '';
// Hash Sequence
$hashSequence = "key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5|udf6|udf7|udf8|udf9|udf10";
if (empty($posted['hash']) && sizeof($posted) > 0) {
  if (
    empty($posted['key'])
    || empty($posted['txnid'])
    || empty($posted['amount'])
    || empty($posted['firstname'])
    || empty($posted['email'])
    || empty($posted['phone'])
    || empty($posted['productinfo'])
    || empty($posted['surl'])
    || empty($posted['furl'])
    || empty($posted['service_provider'])
  ) {
    $formError = 1;
  } else {
    $hashVarsSeq = explode('|', $hashSequence);
    $hash_string = '';
    foreach ($hashVarsSeq as $hash_var) {
      $hash_string .= isset($posted[$hash_var]) ? $posted[$hash_var] : '';
      $hash_string .= '|';
    }

    $hash_string .= $SALT;

    $hash = strtolower(hash('sha512', $hash_string));
    $action = $PAYU_BASE_URL . '/_payment';
  }
} elseif (!empty($posted['hash'])) {
  $hash = $posted['hash'];
  $action = $PAYU_BASE_URL . '/_payment';
}
file_put_contents('logs.txt', date('Y-m-d H:i:s') . ' :payu_popup data:' . PHP_EOL . json_encode(array_map('utf8_encode', $posted)) . PHP_EOL . '---------------------' . PHP_EOL, FILE_APPEND);

?>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <script>
    var hash = '<?php echo $hash ?>';

    function submitPayuForm() {
      if (hash == '') {
        return;
      }
      var payuForm = document.forms.payuForm;
      payuForm.submit();
    }
  </script>
</head>

<body onload="submitPayuForm()" style="display:none">
  <h2>PayU Form</h2>
  <br />
  <?php if ($formError) { ?>

    <span style="color:red">Please fill all mandatory fields.</span>
    <br />
    <br />
  <?php } ?>
  <form action="<?php echo $action; ?>" method="post" name="payuForm">
    <input type="hidden" name="key" value="<?php echo $MERCHANT_KEY ?>" />
    <input type="hidden" name="hash" value="<?php echo $hash ?>" />
    <input type="hidden" name="txnid" value="<?php echo $txnid ?>" />
    <table>
      <tr>
        <td><b>Mandatory Parameters</b></td>
      </tr>
      <tr>
        <td>Amount: </td>
        <td><input name="amount" id="amount" value="<?php echo (empty($posted['amount'])) ? '' : $posted['amount'] ?>" /></td>
        <td>First Name: </td>
        <td><input name="firstname" id="firstname" value="<?php echo (empty($posted['firstname'])) ? '' : $posted['firstname']; ?>" /></td>
      </tr>
      <tr>
        <td>Email: </td>
        <td><input name="email" id="email" value="<?php echo (empty($posted['email'])) ? '' : $posted['email']; ?>" /></td>
        <td>Phone: </td>
        <td><input name="phone" id="phone" value="<?php echo (empty($posted['phone'])) ? '' : $posted['phone']; ?>" /></td>
      </tr>
      <tr>
        <td>Product Info: </td>
        <td colspan="3"><textarea id="productinfo" name="productinfo"><?php echo (empty($posted['productinfo'])) ? '' : $posted['productinfo'] ?></textarea></td>
      </tr>
      <tr>
        <td>Success URI: </td>
        <td colspan="3"><input type="hidden" name="surl" value="my_success.php" size="64" /></td>
      </tr>
      <tr>
        <td>Failure URI: </td>
        <td colspan="3"><input type="hidden" name="furl" value="my_failure.php" size="64" /></td>
      </tr>

      <tr>
        <td colspan="3"><input type="hidden" name="service_provider" value="payu_paisa" size="64" /></td>
      </tr>

      <tr>
        <td><b>Optional Parameters</b></td>
      </tr>
      <tr>
        <td>Last Name: </td>
        <td><input name="lastname" id="lastname" value="<?php echo (empty($posted['lastname'])) ? '' : $posted['lastname']; ?>" /></td>
        <td>Cancel URI: </td>
        <td><input name="curl" value="my_failure.php" /></td>
      </tr>
      <tr>
        <td>Address1: </td>
        <td><input name="address1" id="address1" value="<?php echo (empty($posted['address1'])) ? '' : $posted['address1']; ?>" /></td>
        <td>Address2: </td>
        <td><input name="address2" id="address2" value="<?php echo (empty($posted['address2'])) ? '' : $posted['address2']; ?>" /></td>
      </tr>
      <tr>
        <td>City: </td>
        <td><input name="city" id="city" value="<?php echo (empty($posted['city'])) ? '' : $posted['city']; ?>" /></td>
        <td>State: </td>
        <td><input name="state" id="state" value="<?php echo (empty($posted['state'])) ? '' : $posted['state']; ?>" /></td>
      </tr>
      <tr>
        <td>Country: </td>
        <td><input name="country" value="<?php echo (empty($posted['country'])) ? '' : $posted['country']; ?>" /></td>
        <td>Zipcode: </td>
        <td><input name="zipcode" value="<?php echo (empty($posted['zipcode'])) ? '' : $posted['zipcode']; ?>" /></td>
      </tr>
      <tr>
        <td>UDF1: </td>
        <td><input name="udf1" value="<?php echo (empty($posted['udf1'])) ? '' : $posted['udf1']; ?>" /></td>
        <td>UDF2: </td>
        <td><input name="udf2" value="<?php echo (empty($posted['udf2'])) ? '' : $posted['udf2']; ?>" /></td>
      </tr>
      <tr>
        <td>UDF3: </td>
        <td><input name="udf3" value="<?php echo (empty($posted['udf3'])) ? '' : $posted['udf3']; ?>" /></td>
        <td>UDF4: </td>
        <td><input name="udf4" value="<?php echo (empty($posted['udf4'])) ? '' : $posted['udf4']; ?>" /></td>
      </tr>
      <tr>
        <td>UDF5: </td>
        <td><input name="udf5" value="<?php echo (empty($posted['udf5'])) ? '' : $posted['udf5']; ?>" /></td>
        <td>PG: </td>
        <td><input name="pg" value="<?php echo (empty($posted['pg'])) ? '' : $posted['pg']; ?>" /></td>
      </tr>
      <tr>
        <?php if (!$hash) { ?>
          <td colspan="4"><input type="submit" value="Submit" /></td>
        <?php } ?>
      </tr>
    </table>
  </form>
</body>

</html>

  1. 我的 my_success.php 文件(与 my_failure.php 相同)
<?php

$returnArray = [];
$returnArray['status'] = $_POST['status'];
$returnArray['txnid'] = $_POST['txnid'];
$returnArray['amount'] = $_POST['amount'];
$returnArray['firstname'] = $_POST['firstname'];
$returnArray['addedon'] = $_POST['addedon'];
$returnArray['productinfo'] = $_POST['productinfo'];
$returnArray['lastname'] = $_POST['lastname'];
$returnArray['email'] = $_POST['email'];
$returnArray['phone'] = $_POST['phone'];

$success_response = json_encode(array_map('utf8_encode', $returnArray));

?>

<script>
      var success_response = '<?php echo $success_response; ?>';
      window.ReactNativeWebView.postMessage(success_response);
</script>
© www.soinside.com 2019 - 2024. All rights reserved.