<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
		<id>https://wiki.nonip.net/index.php?action=history&amp;feed=atom&amp;title=Php%2F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E9%80%A3%E6%90%BA%2F%E8%BF%94%E9%87%91API%2FAppStore%2Fv1</id>
		<title>Php/アプリストア連携/返金API/AppStore/v1 - 変更履歴</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.nonip.net/index.php?action=history&amp;feed=atom&amp;title=Php%2F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E9%80%A3%E6%90%BA%2F%E8%BF%94%E9%87%91API%2FAppStore%2Fv1"/>
		<link rel="alternate" type="text/html" href="https://wiki.nonip.net/index.php?title=Php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E9%80%A3%E6%90%BA/%E8%BF%94%E9%87%91API/AppStore/v1&amp;action=history"/>
		<updated>2026-04-18T01:57:53Z</updated>
		<subtitle>このウィキのこのページに関する変更履歴</subtitle>
		<generator>MediaWiki 1.24.2</generator>

	<entry>
		<id>https://wiki.nonip.net/index.php?title=Php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E9%80%A3%E6%90%BA/%E8%BF%94%E9%87%91API/AppStore/v1&amp;diff=20419&amp;oldid=prev</id>
		<title>Admin: /* 返金通知の実際のjwtデコードJSON */</title>
		<link rel="alternate" type="text/html" href="https://wiki.nonip.net/index.php?title=Php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E9%80%A3%E6%90%BA/%E8%BF%94%E9%87%91API/AppStore/v1&amp;diff=20419&amp;oldid=prev"/>
				<updated>2025-06-27T18:47:41Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;返金通知の実際のjwtデコードJSON&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;←前の版&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;2025年6月27日 (金) 18:47時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;行43:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;行43:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; },&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; },&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;quot;version&amp;quot;: &amp;quot;2.0&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;quot;version&amp;quot;: &amp;quot;2.0&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;==返金通知の実際のjwtデコードJSON==&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;quot;notificationType&amp;quot;: &amp;quot;SUBSCRIBED&amp;quot;,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;quot;subtype&amp;quot;: &amp;quot;INITIAL_BUY&amp;quot;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;quot;notificationUUID&amp;quot;: &amp;quot;a1b2c3d4-5678-90ef-1234-567890abcdef&amp;quot;,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;quot;data&amp;quot;: {&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;quot;appAppleId&amp;quot;: 123456789,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;quot;bundleId&amp;quot;: &amp;quot;com.example.app1&amp;quot;,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;quot;bundleVersion&amp;quot;: &amp;quot;202504201241&amp;quot;,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;quot;environment&amp;quot;: &amp;quot;Production&amp;quot;,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;quot;signedRenewalInfo&amp;quot;: &amp;quot;eyJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlFTURDQ0E3YWdByXjXWPNAT8g~略&amp;quot;,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;quot;signedTransactionInfo&amp;quot;: &amp;quot;eyJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlFTURDQ0E3YWdBd0lCQWdJUWL9sbGXT55ZIi7Wt470x3w~略&amp;quot;, &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;quot;status&amp;quot;: 1&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; }&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; },&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;quot;version&amp;quot;: &amp;quot;2.0&amp;quot;,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;quot;signedDate&amp;quot;: 1749043664833&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://wiki.nonip.net/index.php?title=Php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E9%80%A3%E6%90%BA/%E8%BF%94%E9%87%91API/AppStore/v1&amp;diff=20412&amp;oldid=prev</id>
		<title>Admin: ページの作成:「 ==appleのstorekitの返金のドキュメント== https://developer.apple.com/jp/documentation/storekit/in-app_purchase/handling_refund_notifications/  https://develope...」</title>
		<link rel="alternate" type="text/html" href="https://wiki.nonip.net/index.php?title=Php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E9%80%A3%E6%90%BA/%E8%BF%94%E9%87%91API/AppStore/v1&amp;diff=20412&amp;oldid=prev"/>
				<updated>2025-06-27T18:15:09Z</updated>
		
		<summary type="html">&lt;p&gt;ページの作成:「 ==appleのstorekitの返金のドキュメント== https://developer.apple.com/jp/documentation/storekit/in-app_purchase/handling_refund_notifications/  https://develope...」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
==appleのstorekitの返金のドキュメント==&lt;br /&gt;
https://developer.apple.com/jp/documentation/storekit/in-app_purchase/handling_refund_notifications/&lt;br /&gt;
&lt;br /&gt;
https://developer.apple.com/documentation/AppStoreServerNotifications/unified_receipt/Latest_receipt_info-data.dictionary&lt;br /&gt;
&lt;br /&gt;
==ストアからの通知url設定箇所==&lt;br /&gt;
appstore管理画面/配信/アプリ情報/appstoreサーバ通知&lt;br /&gt;
&lt;br /&gt;
==返金通知のサンプルJSON==&lt;br /&gt;
*subtype: &amp;quot;DISPUTE&amp;quot;, or &amp;quot;OTHER&amp;quot;&lt;br /&gt;
*signedRenewalInfo: 省略可能（テスト時）&lt;br /&gt;
*signedTransactionInfo: 省略可能（テスト時）&lt;br /&gt;
*cancellation_reason: 1:ユーザー申請, 0:その他&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;notificationType&amp;quot;: &amp;quot;REFUND&amp;quot;,&lt;br /&gt;
  &amp;quot;subtype&amp;quot;: &amp;quot;DISPUTE&amp;quot;, // または &amp;quot;OTHER&amp;quot;&lt;br /&gt;
  &amp;quot;notificationUUID&amp;quot;: &amp;quot;a1b2c3d4-5678-90ef-1234-567890abcdef&amp;quot;,&lt;br /&gt;
  &amp;quot;data&amp;quot;: {&lt;br /&gt;
    &amp;quot;appAppleId&amp;quot;: 123456789,&lt;br /&gt;
    &amp;quot;bundleId&amp;quot;: &amp;quot;com.example.app1&amp;quot;,&lt;br /&gt;
    &amp;quot;bundleVersion&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
    &amp;quot;environment&amp;quot;: &amp;quot;Sandbox&amp;quot;,&lt;br /&gt;
    &amp;quot;signedRenewalInfo&amp;quot;: &amp;quot;...&amp;quot;,&lt;br /&gt;
    &amp;quot;signedTransactionInfo&amp;quot;: &amp;quot;...&amp;quot;, &lt;br /&gt;
    &amp;quot;unified_receipt&amp;quot;: {&lt;br /&gt;
      &amp;quot;environment&amp;quot;: &amp;quot;Sandbox&amp;quot;,&lt;br /&gt;
      &amp;quot;latest_receipt&amp;quot;: &amp;quot;BASE64_ENCODED_RECEIPT_DATA&amp;quot;,&lt;br /&gt;
      &amp;quot;latest_receipt_info&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;cancellation_date_ms&amp;quot;: &amp;quot;1625097600000&amp;quot;,&lt;br /&gt;
          &amp;quot;cancellation_reason&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
          &amp;quot;product_id&amp;quot;: &amp;quot;premium_subscription&amp;quot;,&lt;br /&gt;
          &amp;quot;transaction_id&amp;quot;: &amp;quot;1000000123456789&amp;quot;,&lt;br /&gt;
          &amp;quot;original_transaction_id&amp;quot;: &amp;quot;1000000123456789&amp;quot;,&lt;br /&gt;
          &amp;quot;purchase_date_ms&amp;quot;: &amp;quot;1625000000000&amp;quot;,&lt;br /&gt;
          &amp;quot;expires_date_ms&amp;quot;: &amp;quot;1627600000000&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;status&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;2.0&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==返金通知の実際のjwtデコードJSON==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;notificationType&amp;quot;: &amp;quot;SUBSCRIBED&amp;quot;,&lt;br /&gt;
  &amp;quot;subtype&amp;quot;: &amp;quot;INITIAL_BUY&amp;quot;&lt;br /&gt;
  &amp;quot;notificationUUID&amp;quot;: &amp;quot;a1b2c3d4-5678-90ef-1234-567890abcdef&amp;quot;,&lt;br /&gt;
  &amp;quot;data&amp;quot;: {&lt;br /&gt;
    &amp;quot;appAppleId&amp;quot;: 123456789,&lt;br /&gt;
    &amp;quot;bundleId&amp;quot;: &amp;quot;com.example.app1&amp;quot;,&lt;br /&gt;
    &amp;quot;bundleVersion&amp;quot;: &amp;quot;202504201241&amp;quot;,&lt;br /&gt;
    &amp;quot;environment&amp;quot;: &amp;quot;Production&amp;quot;,&lt;br /&gt;
    &amp;quot;signedRenewalInfo&amp;quot;: &amp;quot;eyJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlFTURDQ0E3YWdByXjXWPNAT8g~略&amp;quot;,&lt;br /&gt;
    &amp;quot;signedTransactionInfo&amp;quot;: &amp;quot;eyJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlFTURDQ0E3YWdBd0lCQWdJUWL9sbGXT55ZIi7Wt470x3w~略&amp;quot;, &lt;br /&gt;
    &amp;quot;status&amp;quot;: 1&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;2.0&amp;quot;,&lt;br /&gt;
  &amp;quot;signedDate&amp;quot;: 1749043664833&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==appstore内の返金リクエストurl==&lt;br /&gt;
ttps://reportaproblem.apple.com/&lt;br /&gt;
&lt;br /&gt;
==apple署名検証==&lt;br /&gt;
jsonはjwtエンコードされてるので、jwtデコードする必要がある。&lt;br /&gt;
その際に、apple証明書で、検証する。アプリ別(bundle_id別)ではなく、どのアプリでも同じ証明書で検証する。&lt;br /&gt;
===opensslでapple署名検証しながらfirebaseのjwtで、jwtデコードする===&lt;br /&gt;
composerで、firebase/php-jwtのインストール&lt;br /&gt;
 composer require firebase/php-jwt&lt;br /&gt;
&lt;br /&gt;
apple署名検証付きデコード処理&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use \Firebase\JWT\JWT;&lt;br /&gt;
use \Firebase\JWT\Key;&lt;br /&gt;
&lt;br /&gt;
function decodeAppleJWS($signedPayload) {&lt;br /&gt;
    // 1. JWSのヘッダーを手動で解析（アルゴリズム確認用）&lt;br /&gt;
    $parts = explode('.', $signedPayload);&lt;br /&gt;
    $headerBase64 = $parts[0];&lt;br /&gt;
    $header = json_decode(base64_decode($headerBase64), true);&lt;br /&gt;
    &lt;br /&gt;
    if ($header['alg'] !== 'ES256') {&lt;br /&gt;
        throw new Exception('Invalid algorithm. Expected ES256');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 2. Appleの証明書チェーンを準備&lt;br /&gt;
    $leafCert = isset($header['x5c'][0]) ? $header['x5c'][0] : null;&lt;br /&gt;
    if (!$leafCert) {&lt;br /&gt;
        throw new Exception('Missing x5c certificate chain');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 3. 中間証明書とルート証明書をダウンロード&lt;br /&gt;
    $intermediateCert = file_get_contents('https://www.apple.com/certificateauthority/AppleWWDRCAG6.cer');&lt;br /&gt;
    $rootCert = file_get_contents('https://www.apple.com/certificateauthority/AppleRootCA-G3.cer');&lt;br /&gt;
&lt;br /&gt;
    // 4. 証明書チェーンを検証&lt;br /&gt;
    $certificateChain = array(&lt;br /&gt;
        'leaf' =&amp;gt; &amp;quot;-----BEGIN CERTIFICATE-----\n{$leafCert}\n-----END CERTIFICATE-----&amp;quot;,&lt;br /&gt;
        'intermediate' =&amp;gt; $intermediateCert,&lt;br /&gt;
        'root' =&amp;gt; $rootCert&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    if (!verifyCertificateChain($certificateChain)) {&lt;br /&gt;
        throw new Exception('Certificate chain validation failed');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 5. firebase/php-jwt でデコード&lt;br /&gt;
    // PHP 5系では新しい構文が使えないので、適切なJWTライブラリのバージョンを使用する必要あり&lt;br /&gt;
    return JWT::decode(&lt;br /&gt;
        $signedPayload,&lt;br /&gt;
        $certificateChain['leaf'],&lt;br /&gt;
        array('ES256')&lt;br /&gt;
    );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 証明書チェーン検証（簡略版）&lt;br /&gt;
function verifyCertificateChain($chain) {&lt;br /&gt;
    // 1. 証明書をメモリ上で読み込み&lt;br /&gt;
    $cert = openssl_x509_read($chain['leaf']);&lt;br /&gt;
    if ($cert === false) {&lt;br /&gt;
        throw new Exception('Memory read failed: ' . openssl_error_string());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 2. 一時ファイルを作成&lt;br /&gt;
    $tempFile = tempnam(sys_get_temp_dir(), 'cert_');&lt;br /&gt;
    file_put_contents($tempFile, $chain['leaf']);&lt;br /&gt;
    &lt;br /&gt;
    // 3. 証明書検証（PHP 5系用の引数）&lt;br /&gt;
    $result = openssl_x509_checkpurpose(&lt;br /&gt;
        $tempFile,          // 証明書ファイルパス&lt;br /&gt;
        X509_PURPOSE_ANY,   // 目的&lt;br /&gt;
        array(),            // CAファイル（空でシステムデフォルトを使用）&lt;br /&gt;
        $tempFile    // 検証対象証明書&lt;br /&gt;
    );&lt;br /&gt;
    &lt;br /&gt;
    // 4. リソース解放&lt;br /&gt;
    openssl_x509_free($cert);&lt;br /&gt;
    unlink($tempFile);&lt;br /&gt;
    &lt;br /&gt;
    return (bool)$result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>