微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将嵌套的json对象转换为php字符串而不剥离值

我收到一个带有以下JSON对象的HTTP帖子:

{"notification":{"version":6.0,"attemptCount":0,"role":"vendOR","site":"nicholeen","receipt":"********","currency":"USD","transactionType":"TEST","transactionTime":1406070122781,"paymentMethod":"VISA","totalProductAmount":1.00,"totalTaxAmount":0.00,"totalShippingAmount":0.00,"customer":{"shipping":{"firstName":"TEST","lastName":"USER","fullName":"Test User","email":"testuser@somesite.com","address":{}},"billing":{"firstName":"TEST","lastName":"USER","fullName":"Test User","email":"testuser@somesite.com","address":{}}},"lineItems":[{"itemNo":"1","productTitle":"A passed in title","shippable":false,"recurring":false,"customerProductAmount":1.00,"customerTaxAmount":0.00}]},"verification":"2745A502"}

我需要将“通知”JSON对象转换为分配给PHP变量的JSON字符串,而不会丢失任何数据,包括小数.

目前我正在使用$ipn_raw = file_get_contents(‘PHP:// input’);来接收IPN.
然后我json_decode将JSON编码为PHP变量,然后使用json_encode重新编码通知部分.这是代码

$ipn_raw = file_get_contents('PHP://input');
$ipn = json_decode($ipn_raw);
$notification = $ipn['notification'];
$result = json_encode($notification);

但是,结果剥离了一些值,给出了以下内容

{"version":6,"attemptCount":0,"role":"vendOR","site":"nicholeen","receipt":"********","currency":"USD","transactionType":"TEST","transactionTime":1406095846441,"paymentMethod":"VISA","totalProductAmount":1,"totalTaxAmount":0,"totalShippingAmount":0,"customer":{"shipping":{"firstName":"TEST","lastName":"USER","fullName":"Test User","email":"testuser@somesite.com","address":[]},"billing":{"firstName":"TEST","lastName":"USER","fullName":"Test User","email":"testuser@somesite.com","address":[]}},"lineItems":[{"itemNo":"1","productTitle":"A passed in title","shippable":false,"recurring":false,"customerProductAmount":1,"customerTaxAmount":0}]}

你可以看到版本6.0现在只是版本6,totalProductAmount是1.00,现在是1,等等.

如何在结果中没有任何值更改的情况下执行此操作?

谢谢!

根据请求,这里有一些额外的背景信息,说明为什么我需要将所有内容与原始内容保持不变. Clickbank给了我以下信息,以便创建必要的SHA 1哈希来验证我从他们那里收到的第6版IPN(见https://support.clickbank.com/entries/22803622-Instant-Notification-Service)

1)使用JSON库/ DSL从IPN中提取通知”JSON对象.
2)将“通知”JSON对象转换为JSON字符串.该字符串应以大括号开头{并以大括号结束},因为它是JSON对象的表示.
3)在通知对象的结束大括号之后将密钥直接附加到字符串上.没有空格或分隔符.
4)SHA 1散列在步骤3中创建的字符串.
5)获取在步骤4中创建的哈希的前8个字符.这是v6 IPN中“验证”字段的值.

如果需要,我可以为其余步骤提供我的所有代码,但此时我唯一遇到的问题是将通知对象单独放入字符串中.

解决方法:

您要问的是(鉴于您正在散列JSON对象的字符串表示形式),您需要通过字符串操作方法(例如regex)提取JSON的相关部分:

$result = preg_replace(array('^\{[^{]', '[^}]\}$'), '', $in);

这将在开始时将所有内容剥离到第二个大括号,并从最后的第二个大括号中删除所有内容. (但显然只有当你的JSON具有这种确切的格式时才会起作用,即通知是唯一的嵌套对象,第一个对象,以及之后的所有内容都包含no}(尤其是验证码))

似乎有一个关于这个的“bug”报告:https://bugs.php.net/bug.php?id=50224,虽然看起来字符串化6.0是预期的行为,JavaScript也做同样的事情.另请参阅此相关问题:PHP function json_decode decodes float value with zeros after point as int

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐